为什么MVC模型Binder集需要int,long值?

时间:2013-06-17 08:10:23

标签: asp.net-mvc asp.net-mvc-4 data-annotations

我有一个像这样的模型

public int Id {get;set;}

[Required]
public string FirstName{get; set}
[Required]
public string LastName{get; set}

Id在DB中自动生成。当我想要调用Create Action时ModelState说“需要Id字段”!!!!我找到了this我的问题,但它没有清理解决方案。 还有其他方法可以解决这个问题吗?

我是否有办法更改值类型的Mvc ModelBinder行为?

3 个答案:

答案 0 :(得分:8)

此问题的最佳解决方案是使用视图模型。视图模型是您专门设计的类,以满足视图的要求。因此,您的控制器操作将此视图模型作为参数。只需停止将您的域模型传递给您的视图即可。就是这样。

如果您不想遵循良好做法并使用视图模型,可以通过将以下内容添加到Application_Start来禁用此隐式验证:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

另一个 hack 是使用[Bind(Exclude = "Id")]属性从绑定中排除此属性。是的,这是一个黑客,但如果你不遵循良好的做法,你将不得不忍受黑客。

答案 1 :(得分:1)

虽然@DarinDimitrov建议使用View Models的一个很好的选择,除了那个答案。另外,仅当您不想创建View-Model

时才考虑此选项

ModelState["Id"].Errors.Clear();行动方法中的Post怎么样?

答案 2 :(得分:0)

您还可以将属性类型设置为Nullable<T>,然后只需手动强制执行在使用数据库之前可能需要执行的任何验证。

public int? Id {get;set;}

进一步阅读