2010-01-25 21 views
1

首先一些背景的:处理与ModelBinder的无效值在ASP.NET MVC 1.0

我有一个表格,在这里我回来后的一些对象由MVCS自动物化为对象的内置模型绑定器:

<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的自然不会尝试设置“Hours'属性。但它默认为0,因为它是int而不是字符串

这对我来说现在造成了一些困难,因为现在我看不到用户是否实际输入了0,或者这是否是由无效输入引起的。

因为我正在使用家庭对象 - 实体(实体框架)映射器,我们无法将“小时”属性的脚印更改为int?。我知道MVC有一些内置的验证,但我们宁可不实现,因为我们知道它已经受到了严重的攻击,并且ASP.NET MVC 2.0中还有一些新的验证。

解决方案?

我需要能够指出用户哪个字段是不正确的,这意味着我需要能够捕获一个异常(或可能是一些其他巧妙的解决方案?),在那里我可以做一些逻辑并向用户发回新视图,以澄清他们错误地做了什么。

我目前的想法:编写一个自定义的ModelBinder。

你有什么建议?

回答

0

这对我来说现在造成了一些困难,因为现在我看不到用户是否实际输入了0,或者如果这是由无效输入引起的。

是的,你可以。查看ModelState。

0

虽然这不是特别理想,但您已经声明您不想改变其他任何东西。所以你提到的选项,创建一个自定义的ModelBinder将工作正常。但是,您可能会发现自己要为要绑定的每个实体创建一个ModelBinder。

+0

是的,我不会那样做;)..但感谢您的输入 – CodeMonkey 2010-01-27 23:06:40