124

ASP.NET MVCを使用すると、が必要になる場合があります(フォームの送信など)RedirectToAction

そのような状況の1つは、フォームの送信後に検証エラーが発生し、フォームにリダイレクトする必要があるが、送信先のアクションページではなく、フォームのURLをURLに反映させたい場合です。

フォームに元のPOSTedデータを含める必要があるため、ユーザーの便宜と検証の目的で、データをどのように渡すことができますRedirectToAction()か?viewDataパラメーターを使用すると、POSTパラメーターがパラメーターに変更されGETます。

4

6 に答える 6

81

解決策は、TempDataプロパティを使用して、目的のRequestコンポーネントを格納することです。

例えば:

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.Form());
}

次に、「フォーム」アクションで次の操作を実行できます。

public ActionResult Form()
{
    /* Declare viewData etc. */

    if (TempData["form"] != null)
    {
        /* Cast TempData["form"] to 
        System.Collections.Specialized.NameValueCollection 
        and use it */
    }

    return View("Form", viewData);
}
于 2008-08-05T05:43:27.900 に答える
37

TempDataはフォームコレクションをセッションに保存することに注意してください。この動作が気に入らない場合は、新しいITempDataProviderインターフェイスを実装し、一時データを格納するための他のメカニズムを使用できます。セッション状態の使用があなたを傷つけているという事実を(測定とプロファイリングを介して)知っていない限り、私はそれをしません。

于 2008-08-07T05:12:32.283 に答える
13

MVCContribを見てください。これを行うことができます:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
于 2009-04-05T09:36:53.963 に答える
8

tempdata を回避する別の方法があります。私が気に入っているパターンは、元のレンダリングと無効なフォームの再レンダリングの両方に対して 1 つのアクションを作成することです。次のようになります。

var form = new FooForm();

if (request.UrlReferrer == request.Url)
{
     // Fill form with previous request's data
}

if (Request.IsPost())
{
     if (!form.IsValid)
     {
         ViewData["ValidationErrors"] = ...
     } else {
         // update model
         model.something = foo.something;
         // handoff to post update action
         return RedirectToAction("ModelUpdated", ... etc);
     }
}

// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();

多かれ少なかれそのパターンです。ちょっと疑似。これにより、フォームのレンダリング、値の再表示 (フォームには以前の値が入力されるため)、およびエラー メッセージの表示を処理する 1 つのビューを作成できます。

このアクションへの転記が有効であれば、別のアクションに制御を移します。

MVC のサポートを構築する際に、 .net 検証フレームワークでこのパターンを簡単にしようとしています。

于 2008-08-25T22:06:36.850 に答える