2013-01-25 105 views
0

我對MVC完全陌生,我試圖弄清楚爲什麼不顯示驗證摘要。下面的代碼:驗證摘要中的顯示錯誤如何在驗證摘要中顯示錯誤

視圖:

<% using(var form = Html.BeginForm("Create", "User")) 
{%> 
    <table> 
     <thead> 
      <th>Create User</th> 
      <th><%= Html.ValidationSummary(false) %></th> 
     </thead> 
     <tbody> 
      <tr> 
       <td><%= Html.LabelFor(model => model.Creating.Username) %>:</td> 
       <td><%= Html.TextBoxFor(model => model.Creating.Username) %></td> 
      </tr> 
      <tr> 
       <td><%= Html.LabelFor(model => model.Creating.Firstname) %>:</td> 
       <td><%= Html.TextBoxFor(model => model.Creating.Firstname)%></td> 
      </tr> 
      <tr> 
       <td><%= Html.LabelFor(model => model.Creating.Lastname) %></td> 
       <td><%= Html.TextBoxFor(model => model.Creating.Lastname) %></td> 
      </tr> 
      <tr> 
       <td colspan="2"> 
        <input type="submit" value="Create" /> 
       </td> 
      </tr> 
     </tbody> 
    </table> 

<%}%> 

相關控制器的方法:

[HttpPost] 
public ActionResult Create(User creating) 
{ 
    var response = _service.Save(creating); 
    if (response.Success) 
     return RedirectToAction("Index"); 
    response.Errors.CopyToModelState(this.ModelState); 
    return RedirectToAction("Index"); 
} 

商業邏輯方法:

public Response Save(User user) 
{ 
    //Place Validation logic here 
    //Check username is between 3-30 characters and make sure the username is unique 
    //return response if username fails business rules 

    bool isDataInvalid = false; 
    List<ValidationError> errorList = new List<ValidationError>(); 
    if ((user.Username.Length < 3) || user.Username.Length > 30) 
    { 
     ValidationError invalidUsernameLengthError = new ValidationError(); 
     invalidUsernameLengthError.Property = "Creating.Username"; 
     invalidUsernameLengthError.ErrorMessage = "must be between 3 and 30 characters long"; 
     errorList.Add(invalidUsernameLengthError); 
     isDataInvalid = true; 
    } 

    if (isDataInvalid) 
    { 
     return new Response() 
     { 
      Success = false, 
      Errors = errorList 
     }; 
    } 

    _repository.Save(user); 

    return new Response() 
    { 
     Success = true 
    }; 
} 

Helper方法:

public static void CopyToModelState(this List<ValidationError> errors, ModelStateDictionary modelState) 
{ 
    foreach (var error in errors) 
    { 
     modelState.AddModelError(error.Property, error.ErrorMessage); 
    } 
} 

該邏輯做它應該的,但沒有顯示。我檢查了獲取輸出的HTML,並且驗證只是沒有被寫入。我試着將模型的屬性分配給modelState並直接在相關字段上顯示驗證,但這也不起作用。有任何想法嗎?


啊!做一個RedirectToAction會導致一個新的請求,所以錯誤數據會丟失。此外,我正在使用不同的控制器,所以我需要顯式調用原始視圖(Index.aspx)。此外,我的Index.aspx預計該模型實際上不是用戶對象,這是一個不同的列表對象,所以我需要做的:

 var users = _service.FindAll(); 
     return View("Index", new UserListModel() { Users = users }); 

,而不是RedirectToAction。這顯然是驗證錯誤的標準模式 - 爲了成功(無錯)您使用RedirectToAction,但對於錯誤,您需要返回正確的視圖。


好的,謝謝mattytommo - 這真的很有用。但我仍然遇到問題。我現在有了這個控制器 - 類似於你的建議,但仍然沒有顯示錯誤信息。我嘗試了數據註釋,但無法使其正常工作(我正在使用MVC2),並且一直在嘗試我能想到的一切來修復現有代碼。

[HttpPost] 
    public ActionResult Create(User creating) 
    { 
     var response = _service.Save(creating); 
     if (response.Success) 
      return RedirectToAction("Index"); 

     foreach (var error in response.Errors) 
     { 
      ModelState.AddModelError(error.Property, error.ErrorMessage); 
     } 

     return RedirectToAction("Index"); 
    } 

有沒有更多的想法?我很欣賞這個建議!

+1

好奇,爲什麼你不使用'DataAnnotations'這個? –

+1

它看起來像你將它們添加到'modelstate'對象,但不會傳播到** actual **'ModelState'對象。你有沒有嘗試在控制器的'ModelState'上設置它? – mattytommo

+0

我對移動工程車輛瞭解不多。 :(對不起。 –

回答

3

我認爲你的值是通過ModelState變量,所以你在該函數中所做的更改是實際上並不保持。嘗試複製你的函數做什麼,但對實際ModelState對象,就像這樣:

[HttpPost] 
public ActionResult Create(User creating) 
{ 
    var response = _service.Save(creating); 
    if (response.Success) 
     return RedirectToAction("Index"); 

    foreach (var error in response.Errors) 
    { 
     ModelState.AddModelError(error.Property, error.ErrorMessage); 
    } 

    return View(creating); 
} 

您也應該檢查出MVC數據註釋,像你這樣的驗證可以簡單地通過把這兩個屬性的替換Username屬性:

[MinLength(3), MaxLength(30)] 
public string UserName { get; set; } 

或者使用StringLength(感謝@SimonWhitehead)只有一個屬性:

[StringLength(30, MinimumLength = 3)] 

數據註釋:Here

+0

'StringLength'把它變成一個屬性:) –

+0

@SimonWhitehead這是做min **和** max嗎? – mattytommo

+0

@SimonWhitehead在這裏看不到:S http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.stringlengthattribute.stringlengthattribute.aspx – mattytommo

相關問題