2

誰かがこれを理解するのを手伝ってくれませんか。次のコードがあります。

コントローラー

public ActionResult Stuff(PersonModel model)
{
    model.Address = "Some Address";

    return PartialView("_Registration", model);
}

景色

    @Ajax.BeginForm("Stuff", new AjaxOptions(){ HttpMethod="POST", UpdateTargetId="the_form", InsertionMode=InsertionMode.Replace, OnSuccess="Stuff"  })
{
    <div id="the_form">
        @{Html.RenderPartial("_Registration", new TypeScriptTest.Models.PersonModel());}
    </div>

    <input type="submit" value="Get Addreess" />
}

部分的なビュー

@model TypeScriptTest.Models.PersonModel

<table>
    <tr>
        <td>
            Name: 
        </td>
        <td>
            @Html.TextBoxFor(c => c.Name)
        </td>
    </tr>
    <tr>
        <td>
            Address: 
        </td>
        <td>
             @Html.TextBoxFor(c => c.Address)
        </td>
    </tr>
</table>

データは、2 つのフィールドに入力した内容とともに投稿されます。しかし、Address プロパティの値を「Some Address」に置き換えて、古いビューを置き換える新しいビューを取得することが期待される PartialView を返します。これはおそらく発生しますが、古いものを置き換えるビューには新しい「Some Address」値が含まれていません。私が投稿したビューとまったく同じように見えます。

回避策はありますが、ここで何が起こっているのかを理解したいです。私の回避策は次のとおりです。

public ActionResult Stuff(PersonModel model)
{
    model.Address = "Some Address";

    var v = PartialView("_Registration");

    var view = v.ViewEngineCollection.OfType<System.Web.Mvc.RazorViewEngine>().Single().FindPartialView(new ControllerContext(HttpContext, RouteData, this), "_Registration", false);

    var result = new PartialViewResult() { View = view.View };

    result.ViewData.Model = model;

    return result;
}

ここでは、FindPartialView の最後のパラメーターとして false を使用してキャッシュをバイパスできます。このパラメーターを true に設定すると、説明した問題と同じ問題が発生します。

この問題が発生する理由と、この問題を回避する正しい方法は何ですか? 私の回避策はうまくいきますが、問題を理解したいと思います。

4

1 に答える 1

1

それでも興味がある場合は、これは、フォームから送信された値が ModelState に格納され、HtmlHelpers をレンダリングするときに、ModelState の値が現在のモデル オブジェクトの値よりも優先されるためです。

ユーザーが送信した値を変更する場合は、modelState をクリアするか、変更する単一のプロパティのエントリをクリアすることができます。(モデルの状態をクリアすると、送信された値のエラーもクリアされるため、注意してください。少なくとも、手動で変更する前に ModelState が有効であることを確認する必要があります)

あなたの回避策により、送信された値のないきれいな ModelState が得られると思います。

この同様の質問への回答も役立つ場合があります: Asp.net MVC ModelState.Clear

于 2012-11-22T16:22:19.017 に答える