2016-11-10 220 views
0

我在我的控制器中有以下操作方法。但似乎像Model.IsValid()始終返回false,即使驗證條件正常並且不顯示成功消息。任何幫助,將不勝感激。ASP.NET MVC模型驗證總是失敗

[ActionName("CreateNewEmployeeForm")] 
    [HttpPost] 
    public ActionResult SaveEmployee(EmployeeViewModel employee, string btnSubmit) 
    { 
     switch (btnSubmit) 
     { 
      case "Save Employee": 
       if (ModelState.IsValid) 
       { 
        ViewBag.Message = "Thanks! We got your information."; 
        return View(); 
       } 
       else 
       { 
        return View(); 
       } 
       break; 
      case "Cancel": 
       return RedirectToAction("EmployeeForm"); 
     } 
     return new EmptyResult(); 
    } 

以下是我已經對實體所用的驗證:

[Required(ErrorMessage ="Please Enter Your Name!")] 
    [MaxLength(24)] 
    [MinLength(8)] 
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Kindly use letters only for name")] 
    public string EmployeeName { get; set; } 

    public string Designation { get; set; } 

    [Required] 
    [MaxLength(7)] 
    [MinLength(4)] 
    [RegularExpression("[^0-9]*$", ErrorMessage = "Salary must be numeric")] 
    public decimal Salary { get; set; } 

    [Required(ErrorMessage = "Please Enter Your Date Of Birth!")] 
    [DataType(DataType.DateTime)] 
    public DateTime DateOfBirth { get; set; } 

    [DataType(DataType.DateTime)] 
    public DateTime DateCreated { get; set; } 
+0

您是否檢查過您的視圖模型屬性以確認它們確實有效? – JB06

+3

只是FYI,你不需要發佈'case'的表單取消「',而應該直接使用'@ Html.ActionLink'將頁面重定向到'EmployeeForm'(這將節省服務器資源) –

+0

什麼驗證錯誤你收到的消息? –

回答

0

你試過嗎? 因爲你的ModelState.IsValid只是檢查他們是否輸入了正確的東西,所以不需要切換東西來確定他們按下了哪個按鈕。

[ActionName("CreateNewEmployeeForm")] 
[HttpPost] 
public ActionResult SaveEmployee(EmployeeViewModel employee, string btnSubmit) 
{ 
    if (ModelState.IsValid) 
    { 
     switch (btnSubmit) 
     { 
      case "Save Employee": 
       ViewBag.Message = "Thanks! We got your information."; 
      ... where you want to send them after they submit their data 
       break; 
      case "Cancel": 
      ... where you want to send them if they cancel (maybe back to the beginning) 
       break; 
     } 
    } 
    return View(); 
} 

這樣你的開關邏輯不會妨礙你。通過在if語句中放置一下來檢查員工模型。

如果btnSubmit == Cancel並且不需要處理ModelState.IsValid或開關,那麼您也可以將一個if狀態提前確定,並在那一點將它們重定向。

+0

是的,通過放置斷點,我發現流程永遠不會觸及if子句,始終執行else塊並返回到表格 – izengod

+0

您的HttpGet ActionResult中是否有btnSubmit?你是如何通過它?通常,httpget讓用戶填寫表單並提交,HttpPost處理提交的數據。如果用戶取消,表單可能會缺少必需的值。如果你刪除了btnSubmit變量,表單處理是否正確? – nocturns2

+0

您可以隨時在您的視圖模型中放置一個隱藏字段,您可以在httppost中檢查以根據需要路由用戶。 – nocturns2

0

檢查你ModelState,看看有什麼是錯誤訊息,還有一點要提的,它不是寫一個動作一個乾淨的方式方法來服務兩個按鈕做兩件不同的事情,你應該創建兩個動作。

1

你可以嘗試這驗證導致錯誤:

foreach (ModelState state in employee.ModelState.Values.Where(x => x.Errors.Count > 0)) 
{ 

} 
0

它看起來像你的正則表達式是不正確的,帽子(^)應該在支架之外?

[RegularExpression("[^0-9]*$", ErrorMessage = "Salary must be numeric")] 

希望得到這個幫助。 :)