即使默认值存在
问题描述:
public abstract class Base : IBase
{
[Required]
public int key {get;set;}
}
public class Entity: Base
{
public string Name {get;set;}
}
public class child : Entity
{
[Required]
public string Park {get;set;}
}
ActionFilter即使默认值存在
public class ValidateViewModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false) {
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
现在,当值被发布到API的话,不设置“重点”领域,因为它是保存请求ModelState.Isvalid无效场。问题是,以上属性表示,模型对字段“key”无效。它已经在那里作为Id字段的0值(作为默认的int)。 我想,它应该验证为真,因为0是默认值。
注意:我无法删除或在上面的BASEENTITY和PARENT实体中进行任何更改。 我只控制CHILD实体和这个属性类。
答
要忽略标记属性为[Required]
可以使用ModelState.Remove("propertyName");
而且,你的财产有一个0值,因为int
不能有这样的0被自动归的NULL
值。但是,如果您没有在表单数据中传递此值,那么模型验证将“认为”它是NULL
,因此会使模型无效。如果你不希望使用呼叫Remove
如上图所示,你必须明确给出一个值Key
财产:-) 来源:The first comment on this page - 信用对此的解释@Stephen Muecke
使用类似
public class ValidateViewModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
ModelState.Remove("key");
if (actionContext.ModelState.IsValid == false) {
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
注意:默认情况下,MVC6模型验证会要求简单标签的所有非空值类型(上帝知道为什么)。 致电
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
禁用此行为。
首先,您的编辑数据不要在您的视图中使用数据模型 - 使用视图模型。而且'int'不是可以为空并且是必需的(你也有'[Required]'属性,所以如果在请求中发送'null'或无效值,那么'ModelState'将是无效的(但是属性将被初始化为其默认) –