さて、私はこれで朝全体を失いました、そして私はどこにも行きません。
私はMVCで良い経験をしており、2008年の最初のベータ版から使用していますが、これを実際に理解することはできません。
私には実質的に2つのGETメソッドがあります。最初のメソッドはフォームをレンダリングします。2つ目は、フォームが指すメソッドです。検索フォームであるため、GETを使用して送信しています。また、パラメーターを含むブックマーク可能なURLが必要です。
このようなもの
[HttpGet]
public ActionResult DisplayForm()
{
Contract.Ensures(Contract.Result<ActionResult>() != null);
Contract.Ensures(Contract.Result<ActionResult>() is ViewResult);
return this.View();
}
[HttpGet]
public ActionResult Search(MyViewModel viewModel)
{
Contract.Requires<ArgumentNullException>(viewModel != null);
Contract.Ensures(Contract.Result<ActionResult>() != null);
Contract.Ensures(Contract.Result<ActionResult>() is ViewResult || Contract.Result<ActionResult>() is RedirectToRouteResult);
var result = this.validator.Validate(viewModel); //FluentValidation validation
if (!result.IsValid)
{
result.FillModelState(this.ModelState); //extension method that uses AddModelError underneath for ValidationMessageFor helpers on search form
return this.RedirectToAction(c => c.DisplayForm()); //MvcContrib redirect to action
}
ViewData.Model = viewModel;
return View();
}
初めてフォームを送信すると、ターゲットメソッドのviewDataが正しく入力されます。
戻って別の検索を行うと、modelbinderが最初に送信したデータを「キャッシュ」したようなものです。viewDataには常に最初の検索の値が含まれています。アプリケーションを再起動するだけでリセットされます。
ModelStateとHttpContext.Requestの両方をチェックしようとしましたが、それらには新しいデータが含まれています(古くはありません)が、それでもviewDataには古いデータが入力されます。また、OnActionExecutingとOnActionExecutedをオーバーライドして、ブレークポイントをそこに配置し、それらのステップでModelStateを確認しようとしましたが、何も奇妙なことは見つかりませんでした。
また、検索メソッドはGETにあり、実行できるため、ブラウザーバーから直接呼び出しようとしました。それでも、ModelStateとRequestには入力したデータが含まれていますが、viewDataには古いデータがあります。
何が起こっているのか本当に理解できないので、これは本当に私の神経質になっています。
どんな助けでも本当にありがたいです。