MVC HTTPPOST修改模型并替换视图



有人可以帮助我理解这一点。我有以下代码:

控制器

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>

数据与我在两个字段中输入的任何内容都发布。但是随后,我将地址属性值替换为"某些地址",然后返回一个部分我希望获得替代旧视图的部分。这可能发生了,但是替代旧的视图并不包括新的"某些地址"值。看起来完全像我发布的视图。

我有解决方法,但我想了解这里发生的事情。我的解决方法如下:

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中的最后一个参数绕过缓存。将此参数设置为真实会导致与讨论中的参数相同的问题。

为什么会发生这种问题,解决此问题的正确方法是什么?我的解决方法很好,但我想了解这个问题。

如果您仍然有兴趣,这是因为从表单中提交的值存储在模型状态中,当呈现htmlhelpers时,模型标准中的任何值都优先于您当前的模型对象值。

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

我想,在您周围的工作中,您最终将拥有一个干净的模型史塔特,而无需提交的值。

您可能还会找到有用的这个类似问题的答案:ASP.NET MVC ModelState.Clear

最新更新