我对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");
}
有没有更多的想法?我很欣赏这个建议!
好奇,为什么你不使用'DataAnnotations'这个? –
它看起来像你将它们添加到'modelstate'对象,但不会传播到** actual **'ModelState'对象。你有没有尝试在控制器的'ModelState'上设置它? – mattytommo
我对移动工程车辆了解不多。 :(对不起。 –