代码之家  ›  专栏  ›  技术社区  ›  Nathan Ridley

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

  •  5
  • Nathan Ridley  · 技术社区  · 15 年前

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

    问题是,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到SQL实体)有一个字段 ,在视图中由以下行处理:

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

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

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

    有什么想法吗?

    6 回复  |  直到 11 年前
        1
  •  6
  •   Eugeniu Torica    15 年前

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

    ModelState.AddModelError()
    

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

    考虑到这一点

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

    仍然不知道为什么它会起作用,但它对我起作用了。

        2
  •  4
  •   Matt Kocaj    15 年前

    可能是您的代码:

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

    null 无效的 Model.MinVolume 它将保留该值。这样地:

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

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

        3
  •  3
  •   tvanfosson    15 年前

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

    报告的相关部分 downloaded framework code

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

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

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

    编辑

        4
  •  0
  •   diadiora    15 年前

    据我所知,解决方案是:

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

        5
  •  0
  •   Eugeniu Torica    15 年前

    <%var minVolume=Request["MinVolume"]??"";%>
    <%=Html.Textbox("MinVolume",minVolume,new {size=5})%>
    
        6
  •  0
  •   Altaf Altaf    15 年前

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

    link text