我對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
我對移動工程車輛瞭解不多。 :(對不起。 –