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

C# ASP.Net MVC ModelState/Html.TextBox回发问题,c#,asp.net-mvc,html-helper,C#,Asp.net Mvc,Html Helper,我有一个问题出现在我试图发布的表单中。在表单未验证的场景中,我采用标准的方法调用ModelState.addmodeleror(),然后返回一个视图结果 问题是,HTML.*助手应该在呈现时提取发布的值,我注意到只有在回发操作的参数列表中包含文本字段时,才会这样做,这不应该是必需的,因为有些表单有太多的字段,不希望将它们全部列为参数 我的行动代码大致如下: [AcceptVerbs(HttpVerbs.Post)] public ActionResult EditDataDefinition(l

我有一个问题出现在我试图发布的表单中。在表单未验证的场景中,我采用标准的方法调用
ModelState.addmodeleror()
,然后返回一个视图结果

问题是,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);
    }

}
现在,dataDefinition(一个LINQ to SQL实体)有一个字段MinVolume,在视图中通过以下行处理:

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>
由于某种原因,这将强制保留字段值。这对我来说似乎很愚蠢,因为我的表单的值远不止这些,而且我不应该只为那个字段添加参数


有什么想法吗?

当您在ModelState on error中设置值时,使用的键是什么?为文本框设置值参数的代码如下所示:

报告的相关部分

正如您所看到的,如果尝试值存在,它将使用它——但只有当相同的键可用时

我知道这是可行的,因为我有一个不带参数的操作,直接从ValueProvider获取值,它使用AddModelError指示验证错误。我确信文本框中的值会被保留


编辑:为了保留值,它们需要以某种方式与模型关联。一种方法是将它们添加到参数列表中。另一种方法是使用UpdateModel(参数名在白名单或无白名单中)。第三种方法是将参数显式地添加到模型中,如@Jenea的答案所示。由于辅助对象仅从模型状态中提取,因此它们必须位于模型状态中才能保留值。它不查看请求的表单属性。

可能是您的代码:

<%= Html.TextBox("MinVolume", null, new { size = 5 })%>

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

据我所知,解决方案是:

[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(int id, FormCollection form)
{
    T itemToUpdate = repository.Get(id);
    UpdateModel(itemToUpdate, form.ToValueProvider());

    if (itemToUpdate.IsValid())
    {
        repository.SaveOrUpdate(itemToUpdate);
        return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
    }

    repository.DbContext.RollbackTransaction();
    return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
}

祝你好运

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

ModelState.AddModelError()
这个

考虑到这一点

Mimum:<%=Html.Textbox("MinVolume")%>
Mimum:

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

另一个解决方案是,如果您在视图中键入:

<%var minVolume=Request["MinVolume"]??"";%>
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%>

请参阅本文,了解在ASP.NET MVC中处理回发的不同方法


该字段根本没有经过验证-在这个阶段不需要验证。因此,它只是一个“无辜的旁观者”在表单中,如果其他字段中的一个字段本身不起作用,并因此导致表单再次呈现,则希望保留其新值。我突然想知道,我是否错误地假设ModelState应尝试保留名称与模型匹配的所有字段。也许它只保留通过参数列表传入或通过AddModelError引用的字段?如果是这样的话,这看起来有点愚蠢,因为我当然想保留形式上的一切,而不仅仅是具体的案例。然后,MVC仍然没有正确地保留复选框字段……不,指定null应该指定现有模型上下文用于查询值。指定MinVolume是显式的,将强制使用该值而不是以前提交的值。不正确。指定MinVolume将查找ViewDataDoctorial,然后查找ModelStateDictionary以获取后续文章。因此,如果Model.MinVolume是5 becore edit,那么指定MinVolume将在文本框中放置5。然后,如果一篇文章(比如说值3)被发现无效,那么文本框将在第二轮显示3。你试过了吗?通常在“新建”或“创建”视图中指定null,以便初始帖子在字段中显示为空,后续帖子保留输入的值。这正是我执行此操作的方式,每次都有效。我从未见过任何地方需要指定null。链接到你看到的地方会很好哦。。。这可能就是答案!我早上上班时会去登记。谢谢。它之所以有效,是因为它向模型中添加了值,帮助器从中提取值。使用UpdateModel也会起作用,我知道我使用什么,为什么要保留我的文本框值。这篇文章对初学者来说很好。
ModelState.AddModelError()
ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]);
Mimum:<%=Html.Textbox("MinVolume")%>
<%var minVolume=Request["MinVolume"]??"";%>
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%>