ASP.Net MVC ModelState/Html.TextBox回发问题

Nat*_*ley 5 c# asp.net-mvc html-helper

我有一个问题出现在我试图发布的表格中.在表单未验证的情况下,我采用标准的调用路径,ModelState.AddModelError()然后返回View结果.

问题是,HTML.*助手应该在渲染时获取已发布的值,并且我注意到我的文本字段仅在我将其包含在回发操作的参数列表中时才这样做,这不应该是必需的看到某些表单有太多的字段想要将它们全部列为参数.

我的行动代码大致是:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name)
{
    var dataDefinition = ...

    // do some validation stuff
    if (!ModelState.IsValid)
    {
        // manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P
        // ...
        return View(dataDefinition);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,dataDefinition(它是一个LINQ to SQL实体)有一个字段MinVolume,在这一行的视图中处理:

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>
Run Code Online (Sandbox Code Playgroud)

然而,当在模型状态验证失败后呈现视图时,在我们发布的原始页面上键入的值不会被保留,除非我将其作为参数包含在回发方法中.从字面上看,我可以通过这样做来"解决问题":

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,将强制保留字段值.这对我来说似乎很愚蠢,因为我的表单有更多的价值而不仅仅是那个,我不应该只为该字段添加参数.

有任何想法吗?

Eug*_*ica 6

哦,我刚刚改进了我的应用程序设计.出现问题是因为您有自定义验证(我也有).你必须在之后添加

ModelState.AddModelError()
Run Code Online (Sandbox Code Playgroud)

这个

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]);
Run Code Online (Sandbox Code Playgroud)

鉴于它必须是

Mimum:<%=Html.Textbox("MinVolume")%>
Run Code Online (Sandbox Code Playgroud)

仍然不确定为什么它有效,但它对我有用.

  • 它的工作原理是它将值添加到模型中,助手从中获取值.使用UpdateModel也可以工作,我使用的是什么以及为什么我的文本框值被保留. (2认同)

Mat*_*caj 4

难道你的代码是这样的:

<%= Html.TextBox("MinVolume", null, new { size = 5 })%>
Run Code Online (Sandbox Code Playgroud)

..null有默认值参数吗?也许如果你改变nullModel.MinVolume会保留该值。像这样:

<%= Html.TextBox("MinVolume", Model.MinVolume, new { size = 5 })%>
Run Code Online (Sandbox Code Playgroud)

我不确定您的操作是否返回MinVolume模型中的值。如果是的话,上面的方法应该有效。否则,您可能需要稍微重构该操作。