2011-07-25 7 views
2

ASP .Net MVCに関する質問があります。 私はマスタページ(ツールバー)に電子メール登録フォームを持っています。電子メール用のテキストフィールドと、ホームコントローラに電子メールを送信するボタンがあります。コントローラ間の永続エラー

問題は、別のコントローラのページに移動して送信をクリックしてメールを送信し、そのメールにエラーがある場合、ModelState.Errorsにエラーを追加して元のページ(私のフォームの隠しフィールドに元のページがあるので、どこにリダイレクトするか分かります)。すでに他のコントローラには全く異なるModelStateがあるため、エラーが失われていることに気づいているかもしれません。

エラーがなければ、電子メールが保存され、ユーザーは完了したページに正常に送信されます。

私は最初にTempDataにエラーを保存し、それがアクションファイラーまたはベースコントローラークラスのどこかに値を持っているかどうかを確認し、新しいコントローラーModelStateに追加できるかどうかを確認しました。

私は、他の方法やより良い方法があるかどうか、またはTempDataでエラーを送信することが良い方法であるかどうかを知りたいと思います。

ありがとうございました。

答えて

1

POSTアクションの通常のパターンは以下の通りです:もちろん

[HttpPost] 
public ActionResult Foo(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // if there were some validation errors redisplay the form so that 
     // the user can fix them 
     return View(model); 
    } 

    // At this stage we know that the model is valid => we may try do some 
    // processing on it: 
    if (!Repository.TryDoSomeProcessing(model)) 
    { 
     // Something wen wrong with our processing => redisplay the form 
     // to inform the user of this 
     ModelState.AddModelError("foo", "bar"); 
     return View(model); 
    } 

    // at this stage we know that the processing succeeded => we may redirect 
    // there will no longer be error messages. We could at maximum use TempData 
    // to store some success message: 
    TempData["message"] = "Thank you for submitting!"; 
    return RedirectToAction("Success"); 
} 

あなたがこのパターンに違反すると、エラーなどの永続化によってリダイレクトしたい場合は...あなたはあなた自身の上にあります。私はリダイレクト間の永続的なエラーに人々がTempData、セッション、キャッシュなどで苦労しているのを見ました。私はそれらのテクニックをコメントなしで残すことを好む。

+0

ありがとうございます、おそらく、私はおそらくAjaxを使用し、面倒を保存する必要があります! – Raha

+0

@ラーア、ええ、AJAXは多くの面倒を節約することができます。 –

0

私はTempDataを使用して大きな成功を収め、ModelStateをリダイレクトの間に保存し、絶対にお勧めします。

MvcContribプロジェクトには、アクションフィルタを使用してModelStateをTempDataに簡単に保存して復元できる優れたヘルパーがあります。

はしかし、私たちのプロジェクトのために、私たちは手動制御を望んでいたので、私たちは、次のコードを使用することができるように、私たちはTempDataのための拡張メソッドを作成しました:

TempData.SaveModelState(ModelState); 
return Redirect...; 

と復元する:

TempData.RestoreModelState(ModelState); 

この道を私たちのウェブサイトは無効なPOSTからのビューをレンダリングすることはなく、常にGETにリダイレクトされます。

関連する問題