【问题标题】:ASP.NET MVC Form repopulationASP.NET MVC 表单重新填充
【发布时间】:2009-01-04 18:52:12
【问题描述】:

我有一个控制器有两个动作:

[AcceptVerbs("GET")]
    public ActionResult Add()
    {
        PrepareViewDataForAddAction();
        return View();
    }


[AcceptVerbs("POST")]
    public ActionResult Add([GigBinderAttribute]Gig gig, FormCollection formCollection)
    {
        if (ViewData.ModelState.IsValid)
        {
            GigManager.Save(gig);
            return RedirectToAction("Index", gig.ID);
        }
        PrepareViewDataForAddAction();
        return View(gig);
    }

如您所见,当表单发布其数据时,添加操作使用 GigBinder(IModelBinder 的实现)

在这个活页夹中我有:

 if (int.TryParse(bindingContext.HttpContext.Request.Form["StartDate.Hour"], out hour))
        {
           gig.StartDate.Hour = hour;
        }
        else
        {
            bindingContext.ModelState.AddModelError("Doors", "You need to tell us when the doors open");
        }

表单包含一个 ID 为“StartDate.Hour”的文本框。

正如您在上面看到的,GigBinder 进行测试以查看用户是否在 ID 为“StartDate.Hour”的文本框中输入了一个整数。如果不是,则使用 AddModelError 将模型错误添加到模型状态。

由于 gigs 属性 gigs.StartDate.Hour 是强类型的,如果用户在表单文本框中输入了它,我无法将其值设置为例如“TEST”。

因此,我无法设置 gigs.StartDate.Hour 的值,因为用户输入的是字符串而不是整数。

由于添加操作返回视图并传递模型(return View(gig);)如果模型状态无效,则当使用验证消息重新显示表单时,文本框中不会显示值“TEST” .相反,它将是 gig.StartDate.Hour 的默认值。

如何解决这个问题?我真的卡住了!

【问题讨论】:

    标签: asp.net-mvc forms repopulation


    【解决方案1】:

    我认为问题在于您的 ViewModel 与您的 View 匹配不够紧密。在 MVC 中,您的 ViewModel 尽可能与您的 View 匹配非常重要。

    在您的 ViewModel 中,您假设一个整数,但在您的 View 中,您使用 TextBox 来呈现属性,这将允许任何类型的文本。这里存在不匹配,您在尝试映射它们时遇到的困难是不匹配的症状。

    我认为你应该:
    1. 将 ViewModel 属性的类型更改为字符串,然后在控制器中进行验证以确保输入的字符串实际上是数字或:
    2.将View呈现的控件更改为仅允许通过自定义控件或Javascript验证输入数字的控件(如@Qun Wang建议的那样)

    就个人而言,我推荐选项 1。这样 ViewModel 不依赖于 View 实现。

    【讨论】:

      【解决方案2】:

      您可以在 PrepareViewDataForAddAction 方法中执行此操作吗?..

      if (!ViewData.ModelState.IsValid)
          {
              ViewData["StartDate.Hour"] = "Error";
          }
      

      表单上的其他字段仍将根据 Gig 对象的属性进行填充。

      【讨论】:

        【解决方案3】:

        我认为您需要先进行一些基本的客户端验证。 不允许它发布到服务器。

        【讨论】:

          猜你喜欢
          • 2013-06-11
          • 2011-04-11
          • 1970-01-01
          • 1970-01-01
          • 2014-01-01
          • 1970-01-01
          • 2020-06-27
          • 2010-11-10
          • 1970-01-01
          相关资源
          最近更新 更多