【问题标题】:Handling invalid values with ModelBinder in ASP.NET MVC 1.0在 ASP.NET MVC 1.0 中使用 ModelBinder 处理无效值
【发布时间】:2010-01-25 17:16:55
【问题描述】:

首先是一些背景

我有一个表单,我在其中回发了一些由 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。

你有什么建议?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework modelbinder dto


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我不会那样做 ;) .. 但感谢您的意见
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2010-10-28
      • 2018-01-28
      相关资源
      最近更新 更多