首先是一些背景:
我有一个表单,在那里我发布了一些由MVC内置的ModelBinder自动实现对象的对象:
<input type="hidden" name="myobj[0].Id" />
<input type="text" name="myobj[0].Hours" />
<input type="hidden" name="myobj[1].Id" />
<input type="text" name="myobj[1].Hours" />
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(IList<MyObject> myobj);
此外:我想强调的是,我们正在向DTO(DataTransferObjects)发布我们将线下图更深入到实体框架实体中,因此我们宁愿不喜欢在DTO上更改任何内容,除非可能添加属性。
问题
如果用户为“小时”输入无效值,比如说“Fubar”,那么ModelBinder自然不会尝试设置“小时”属性。但它默认为0,因为它是 int 而不是字符串。
这对我来说会造成一些困难,因为现在我无法看到用户是否实际输入了0,或者这是否是由无效输入引起的。
由于我使用的是自制的对象到实体(Entity Framework)映射器,我们无法将'Hours'属性的足迹更改为 int?。我知道MVC有一些内置的验证,但我们宁愿不实现它,因为我们知道它已经受到了极大的攻击,并且ASP.NET MVC 2.0中还有一些新的验证。
解决方案吗
我需要能够向用户指出哪个字段不正确,这意味着我需要能够捕获异常(或者可能是其他一些巧妙的解决方案?),我可以在那里做一些逻辑和发布向用户提供一个新视图,我会澄清他们错误地做了什么。
我目前的想法:编写自定义的ModelBinder。
你有什么建议?
答案 0 :(得分:0)
这对我来说会造成一些困难,因为现在我无法看到用户是否实际输入了0,或者这是否是由无效输入引起的。
是的,你可以。查看ModelState。
答案 1 :(得分:0)
虽然这不是特别理想,但您已声明您不想更改任何其他内容。因此,您提到的选项,创建自定义ModelBinder将正常工作。但是,您可能会发现自己正在为要绑定的每个实体创建一个ModelBinder。