5

我在尝试发布的表单中出现问题。在表单无法验证的情况下,我采用标准的调用方式,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);
    }

}

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

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

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

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)

出于某种原因,这将强制保留字段值。这对我来说似乎很愚蠢,因为我的表单具有比这更多的值,而且我不应该只为该字段添加参数。

有任何想法吗?

4

6 回答 6

6

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

ModelState.AddModelError()

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]);

鉴于它必须是

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

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

于 2009-05-14T19:22:33.177 回答
4

难道是你的代码:

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

..有null默认值参数吗?也许如果您将其更改nullModel.MinVolume它将保留该值。像这样:

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

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

于 2009-05-09T08:31:34.410 回答
3

当您在 ModelState 中设置错误值时,您使用的是什么键?为 TextBox 设置 value 参数的代码如下所示:

下载框架代码的相关部分。

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

如您所见,如果尝试值存在,它将使用它——但前提是相同的密钥可用。

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

编辑:为了保留这些值,它们需要以某种方式与模型相关联。一种方法是将它们添加到参数列表中。另一种方法是使用 UpdateModel(参数名称在白名单中或没有白名单)。第三种方法是将参数显式添加到模型中,如@Jenea 的回答。由于助手只从模型状态中提取,它们必须在那里才能保留值。它不查看请求的 Form 属性。

于 2009-05-07T14:47:51.317 回答
0

据我了解,解决方案是:

[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()));
}

祝你好运!

于 2009-05-13T08:51:50.340 回答
0

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

<%var minVolume=Request["MinVolume"]??"";%>
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%>
于 2009-05-14T19:38:23.217 回答
0

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

链接文本

于 2009-10-06T21:56:35.893 回答