Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET MVC 1.0中使用ModelBinder处理无效值_C#_Asp.net Mvc_Entity Framework_Modelbinder_Dto - Fatal编程技术网

C# 在ASP.NET MVC 1.0中使用ModelBinder处理无效值

C# 在ASP.NET MVC 1.0中使用ModelBinder处理无效值,c#,asp.net-mvc,entity-framework,modelbinder,dto,C#,Asp.net Mvc,Entity Framework,Modelbinder,Dto,首先是一些上下文: 我有一个表单,其中我发回一些对象,这些对象由MVCs内置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"

首先是一些上下文

我有一个表单,其中我发回一些对象,这些对象由MVCs内置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);

[接受动词(HttpVerbs.Post)]
公共行动结果保存(IList myobj);
另外:我想强调的是,我们正在向DTO(DataTransferObjects)发布进一步向下映射到实体框架实体的消息,因此我们不希望DTO上发生任何更改,除了可能添加属性

问题

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

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

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

解决方案?

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

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

你有什么建议

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


是的,你可以。在ModelState中查看

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

是的,我不会这么做;)。。但是谢谢你的投入