2013-01-25 122 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

相关问题