1

首先是一些背景

我有一个表单,我在其中回发了一些由 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 进行任何更改,除非可能添加属性。

问题

如果用户为“Hours”输入了一个无效值,比如“Fubar”,那么 ModelBinder 自然不会尝试设置“Hours”属性。但它默认为 0,因为它是int而不是string

这当然给我带来了一些困难,因为现在我无法看到用户是否实际输入了 0,或者这是由无效输入引起的。

由于我使用的是自制的对象到实体(实体框架)映射器,因此我们无法将“小时”属性的足迹更改为int?. 我知道 MVC 有一些内置的验证,但我们宁愿不实现它,因为我们知道它受到了广泛的攻击,并且在 ASP.NET MVC 2.0 中有一些新的验证。

解决方案?

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

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

你有什么建议?

4

2 回答 2

0

这当然给我带来了一些困难,因为现在我无法看到用户是否实际输入了 0,或者这是由无效输入引起的。

是的你可以。查看模型状态。

于 2010-01-25T17:43:27.677 回答
0

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

于 2010-01-25T19:48:09.847 回答