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>

数据与我在两个字段中键入的任何内容一起发布。但随后我将 Address 属性值替换为“Some Address”并返回一个 PartialView,我希望得到一个替换旧视图的新视图。这可能会发生,但替换旧的视图不包括新的“某些地址”值。它看起来与我发布的视图完全相同。

我有一个解决方法,但我想了解这里发生了什么。我的解决方法如下:

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;
}

在这里,我可以使用 false 作为 FindPartialView 中的最后一个参数来绕过缓存。将此参数设置为 true 会导致与讨论中的问题相同的问题。

为什么会发生这种情况以及解决此问题的正确方法是什么?我的解决方法工作正常,但我想了解这个问题。

4

1 回答 1

1

如果您仍然感兴趣,这是因为从表单提交的值存储在 ModelState 中,并且在呈现 HtmlHelpers 时,ModelState 中的任何值都优先于您当前的模型对象值。

如果要更改用户提交的值,则可以清除 modelState 或清除要更改的单个属性的条目。(清除模型状态时要小心,因为这也会清除任何提交值的错误,至少您可能希望在手动修改之前确保 ModelState 有效)

我猜想通过您的工作,您最终将拥有一个没有提交值的干净 ModelState。

您可能还会发现类似问题的答案很有用:Asp.net MVC ModelState.Clear

于 2012-11-22T16:22:19.017 回答