web-dev-qa-db-ja.com

モデルを使用したASP.NET MVCリダイレクト

現在、コントローラーにフォームコレクションを受け入れ、データを保存し、[詳細]ページにデータを表示するメソッドがあります。現時点では、コードは次のようになっています。

[HttpPost]
public ActionResult Create(PersonModel person)<br>
{
    if (person.IsValid())
    {
        person.additionalData = "Person created successfully";
        return View("Details", person);
    }
}

問題は、この方法で詳細ビューを返すと、URL mysite/Person/Createが保持されることです。理想的には、URLをmysite/Person/Details/IdGoesHereにしたいです。

これが可能であるに違いない。もちろん、Response.Redirectを使用できますが、これではモデルをビューに渡すことができません。私が知る限り、RedirectToActionを使用してモデルを渡すことはできませんか?

助けてくれてありがとう。

編集:確認するには-Createアクションによって生成されたモデルは、Detailsアクションによって作成されたデフォルトのモデルとは異なります。したがって、作成されたモデルが正しくないため、アクションへの直接リダイレクトを実行してIDを渡すことは機能しません。より多くのコンテキストを提供するために、Createアクションのモデルには「Person created successfully」という追加の値が含まれています。Detailsアクションにリダイレクトすると、このメッセージはモデルに存在しません。

39
user460667

私自身のアプリから直接:

public ActionResult Create(Booking item)
{
    if (ModelState.IsValid)
    {
        int newID = _tasks.Create(item);
        // NEW section to emulate model being populated for use in Details view
        TempData["additionalData"] = "Person created successfully";
        return RedirectToAction("Details", new { id = newID });
    }
    else
    {
        return View();
    }
}

次に、「詳細」アクションを次のようにすることはできません。

public ActionResult Details(int id)
{
    var item = _tasks.GetByKey(id);
    var additionalData = TempData["additionalData"];
    if(item != null) {
        if(additonalMessage!=null)
        {
            item.additionalData = additionalData;
        }
        return View(item);
    }
    else
        return View("Notfound");
}

同様のアプローチを採用できませんでしたか?

慣例に従ってリダイレクトを行い、このメッセージを与えるフラグを設定することができますか? tempadataフラグはCreateアクション内でのみ設定されるため、新しい「person」オブジェクトの作成時にのみ発生します。したがって、詳細アクションは、作成アクションの結果としてのみ表示されます

35
jim tollan

RedirectToActionを使用して、提供されているものを補完することができます(TempDataとルーティングを使用)

[HttpPost]
public virtual ActionResult Create(IEnumerable<OrderItem> orderItems)
    {
        if (orderItems.Count() == 0)
        {
            return RedirectToAction("NoOrderItems");
        }
        else
        {
            TempData["orderItems"] = orderItems;
            return RedirectToAction("Confirm");
        }
    }

    [HttpGet]
    public virtual ActionResult Confirm()
    {
        var orderItems = TempData["orderItems"] as IEnumerable<OrderItem>;
        if (orderItems == null || orderItems.Count() == 0)
        {
            this.InvokeHttp404(ControllerContext.HttpContext);
        }

        return View(orderItems);
    }

これは、後続のリクエストで再度作成したり、データベースにまだ保持したくないアイテムに使用します。これにより、確認ページはデータがある場合にのみ「取得」できるため、ビューでnullチェックを行う必要はありません。

9
Jonathan Bates

これにより、詳細モデルが表示され、IDが渡されます。

return RedirectToAction("Details", new { id = person.PersonID });
9
Marko

また、MvcContribのタイプセーフアプローチを使用して、

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID));
8
Yannis