[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); }
如您所见,当表单发布其数据时,Add操作使用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的值,因为用户输入的是字符串而不是整数.
由于Add Action返回视图并传递模型(返回View(gig);)如果modelstate无效,当表单重新显示验证消息时,值“TEST”不会显示在文本框中.相反,它将是gig.StartDate.Hour的默认值.
我如何解决这个问题?我真的卡住了!
解决方法
在您的viewmodel中,您假设一个整数,但在您的View中,您使用TextBox来呈现属性,这将允许任何类型的文本.这里有一个不匹配的问题,你在尝试映射它们时遇到的困难是不匹配的症状.
我想你应该:
1.将viewmodel属性的类型更改为string,然后在控制器中进行验证,以确保输入的字符串实际上是数字或:
2.将View呈现的控件更改为只允许通过自定义控件或Javascript验证输入数字的控件(如@Qun Wang建议的那样)
就个人而言,我建议选项1.这样viewmodel不依赖于View实现.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。