即使默认值存在

问题描述:

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实体和这个属性类。

+0

首先,您的编辑数据不要在您的视图中使用数据模型 - 使用视图模型。而且'int'不是可以为空并且是必需的(你也有'[Required]'属性,所以如果在请求中发送'null'或无效值,那么'ModelState'将是无效的(但是属性将被初始化为其默认) –

要忽略标记属性为[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; 

禁用此行为。