0

さて、私はこれで朝全体を失いました、そして私はどこにも行きません。

私は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には古いデータがあります。

何が起こっているのか本当に理解できないので、これは本当に私の神経質になっています。

どんな助けでも本当にありがたいです。

4

2 に答える 2

0

たくさん実験してみたところ、気づかなかった基本クラスのアクションフィルターに問題があることがわかりました。MvcContribの「PassParametersDurignRedirect」フィルター。それがなければ、すべてが正常に機能します。

于 2012-12-07T12:30:31.137 に答える
0

ModelState.Clear()を試しましたか

検索呼び出しが終了したら?

于 2012-11-30T13:43:17.750 に答える