2017-06-01 47 views
-1

我有這樣一個簡單的模型:添加的ModelState錯誤與正確的鍵名

public class Employer 
{ 
    [Required(ErrorMessage = "Please specify id")] 
    public int Id { get; set; } 

    [MaxLength(256, ErrorMessage = "Max lenght should be less than 256")] 
    [Required(ErrorMessage = "Please specify Name")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Please specify id of organization")] 
    public int OrganizationId { get; set; } 
} 

然後控制器:

public IHttpActionResult Post(Employer employer) 
{ 
    if(!IsActiveOrganization(employer.OrganizationId)) 
    { 
     ModelState.AddModelError(nameof(employer.OrganizationId), "The organization is not active!"); 
    } 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 
} 

正如你可以看到我試圖創建一個新的前驗證模型僱主。所以,當我通過與無效id模型則迴應會喜歡:

{ 
    "message": "The request is invalid.", 
    "modelState": { 
    "employer.Id": [ 
     "Please specify id." 
    ] 
    } 
} 

我要檢查,如果OrganizationId處於活動狀態。爲此我有一個方法IsActiveOrganization它檢查並返回true/false。如果false那麼我需要添加模型錯誤並將400錯誤請求返回給客戶端。一切正常,但在方式,我實現了我會得到響應,如:

{ 
    "message": "The request is invalid.", 
    "modelState": { 
    "employer.Id": [ 
     "Please specify id" 
    ], 
    "OrganizationId": [ 
     "The organization is not active!" 
    ] 
    } 
} 

我如何添加前綴的ModelState錯誤鍵像employer.Id爲自己的錯誤OrganizationId?我應該有硬編碼employer.OrganizationId還是有更好的方法?請讓我知道是否需要添加模式詳細信息。謝謝。

+0

以下任何答案是否解決了您的問題? –

+0

@MarkC。不,請幫忙 –

回答

0

雖然nameof非常適合避免硬編碼屬性名稱,但它並非沒有缺點,而且您偶然發現了其中一個主要問題:它只返回引用屬性的名稱,而不是您用來完整對象圖的名稱訪問它。如果你想避免硬編碼,然後,你就必須做一些事情,如:

ModelState.AddModelError($"{nameof(employer)}.{nameof(employer.OrganizationId)}", "Error message here"); 

這不完全漂亮,但它是你能做的最好的。

+0

它幾乎是一樣的'ModelState.AddModelError(「employer.OrganizationId」,「這裏的錯誤信息」);'我知道屬性可以重命名,但在這種情況下不是 –

+0

嗯,不完全。如果''僱主'或'OrganizationId'的名稱都改變了,你仍然可以使用'nameof',但你仍然對兩者之間的連接進行硬編碼。儘管如此,還是沒有辦法。 –

0

嘗試使用遠程驗證

[Remote("Action", "controller" ErrorMessage = "ErrorMsg")] 
    [Required(ErrorMessage = "Please specify id of organization")] 
    public int OrganizationId { get; set; } 

在你的行動看起來像這樣

public JsonResult Post(int OrganizationId) 
{ 
    if(!IsActiveOrganization(OrganizationId)) 
    { 
     return Json(false, JsonRequestBehavior.AllowGet); 
    } 
    if (!ModelState.IsValid) 
    { 
     return Json(false, JsonRequestBehavior.AllowGet); 
    } 
} 
+0

什麼是JsonRequestBehavior? –

+0

請檢查此類似所有相關的信息可用[JsonRequestBehavior](https://stackoverflow.com/questions/8464677/why-is-jsonrequestbehavior-needed) – Jay

+0

我不需要那 –

0

您可以爲這個自己data attribute,如果你想要一些自定義的名字,但你不真的不需要這個,你可以寫出你想要的名字AddModelError,需要2個字符串,(string key, string Message)所以我不認爲它真的有區別

+0

你是什麼意思?如何可以幫助屬性在這裏? –