1
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'將是無效的(但是屬性將被初始化爲其默認) –

回答

0

要忽略標記屬性爲[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; 

禁用此行爲。