MVC 3模型数值在第二次回传时丢失

3

我有一个包含多个字段的模型的视图。在GET请求时,我有一个存储代码的隐藏字段,此时为空。然后我进行POST请求,在该动作中通过模型向此代码字段添加值,并将模型发送到视图,如下所示:

return View (model);

当视图渲染时,隐藏字段没有代码值,但视图包含第一步中输入的所有其他值。因此,现在当我在第二个按钮上发布时,传递给操作的模型不包含我在第一个POST响应上传递给它的隐藏代码值。
如果我在第一个POST中更新了模型,并使用新值将其发送回视图,我不应该在视图中存储该代码并能够再次将其发布回操作吗?
我刚刚意识到,如果我更改第一个POST返回的任何模型字段并将更新后的模型发送到视图,它只会保留第一个POST操作的值。我这里有一个缓存问题吗?如何管理此行为?谢谢

1
是的,你应该...听起来你的代码肯定有错误,请发布它。 - McGarnagle
你是否在表单内的视图中添加了 **HiddenFor(model => model.Code)**? - McGarnagle
是的,我在表单内部有隐藏字段,并且调试显示新值已发送到浏览器,但表单仍保留旧值... - Manuel Valle
2个回答

5

在执行POST操作时,您应该在更改值之前从ModelState中移除它:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    // update the value of the model that was POSTed to some new value
    model.SomeProperty = "some new value";

    // remove POSTed value from the modelstate if you intend to modify it here
    ModelState.Remove("SomeProperty");

    return View(model);
}

你需要这样做的原因是,Html助手例如Html.HtextBoxForHtml.HiddenFor等首先使用模型状态中的值进行绑定,然后再使用模型中的值。如果你不从模型状态中删除该值,则HiddenFor助手将使用最初提交的空字符串而不是在操作中修改的值。

是的,这就是答案。谢谢您。 - Manuel Valle
或者,您可以使用老式的HTML代码:<input type="hidden" name="SomeProperty" value="@Model.SomeProperty"/> - jporcenaluk

0
问题与Darin所指相同。这里有一个替代方案:
public static MvcHtmlString MyHiddenFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null) {
    var value = expression.Compile().Invoke(html.ViewData.Model);

    TagBuilder input = new TagBuilder("input");
    input.Attributes["type"] = "hidden";
    input.Attributes["id"] = html.IdFor(expression).ToString();
    input.Attributes["name"] = html.NameFor(expression).ToString();

    if (htmlAttributes != null)
        input.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));

    input.Attributes["value"] = value == null ? "" : value.ToString();

    return new MvcHtmlString(input.ToString());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接