我有一个视图,我想对表格中每行中的项目执行不同的操作,类似于此(在~/Views/Thing/Manage.aspx
中):
<table>
<% foreach (thing in Model) { %>
<tr>
<td><%: thing.x %></td>
<td>
<% using (Html.BeginForm("SetEnabled", "Thing")) { %>
<%: Html.Hidden("x", thing.x) %>
<%: Html.Hidden("enable", !thing.Enabled) %>
<input type="submit"
value="<%: thing.Enabled ? "Disable" : "Enable" %>" />
<% } %>
</td>
<!-- more tds with similar action forms here, a few per table row -->
</tr>
<% } %>
在我的ThingController
中,我的功能类似于以下内容:
public ActionResult Manage() {
return View(ThingService.GetThings());
}
[HttpPost]
public ActionResult SetEnabled(string x, bool enable) {
try {
ThingService.SetEnabled(x, enable);
} catch (Exception ex) {
ModelState.AddModelError("", ex.Message); // I know this is wrong...
}
return RedirectToAction("Manage");
}
在大多数情况下,这工作正常。问题是如果ThingService.SetEnabled
抛出错误,我希望能够在表的顶部显示错误。我在页面中尝试了Html.ValidationSummary()
的一些内容,但我无法让它发挥作用。
请注意,我不想将用户发送到单独的页面来执行此操作,而我正在尝试不使用任何JavaScript来执行此操作。
我会以最好的方式展示我的餐桌吗?如何以我希望的方式显示错误?我最终会在页面上找到40个小表格。这种方法很大程度上来自this文章,但它没有按照我需要的方式处理错误。
任何参赛者?
谢谢@Shaharyar:
public ActionResult Manage() {
if (TempData["Error"] != null)
ModelState.AddModelError("", TempData["Error"] as string);
return View(ThingService.GetThings());
}
[HttpPost]
public ActionResult SetEnabled(string x, bool enable) {
try {
ThingService.SetEnabled(x, enable);
} catch (Exception ex) {
TempData["Error"] = ex.Message;
}
return RedirectToAction("Manage");
}
然后只是我表格顶部的ValidationSummary的一个小表格。
<% using (Html.BeginForm()) { %>
<%: Html.ValidationSummary(false) %>
<% } %>
谢谢!
答案 0 :(得分:0)
尝试做:
try {
ThingService.SetEnabled(x, enable);
} catch (Exception ex) {
ModelState.AddModelError("", ex.Message); // I know this is wrong...
return View(); //return to the view to display the error
}
如果返回错误的相同视图,则重新加载视图;您可能需要重新加载一些数据项,但错误地返回视图,框架应该从ModelState中提取这些错误并显示它们。
最有效的方法是使用JQuery将表单提交给服务器,因此您并不总是重新加载页面,并在客户端上显示消息。
HTH。
答案 1 :(得分:0)
我们试试......
您可以使用TempData
字典来执行此类操作。
您可能 依赖其他网页来处理错误。
因为只要ViewModel无法传递给View,就会抛出异常。
但是如果模型有一些问题,你可以执行以下操作(只需将空模型传递给视图):
public SetEnabled(string x, bool enable) {
try {
ThingService.SetEnabled(x, enable);
return View(viewModel);
} catch {
TempData["GetThingsError"] = "Oops! Some error happened while processing your request!"
return View();
/*
* Note that you can also pass the initial model
* back to the view -> this will do the model validation
* (specified in your model)
*/
}
return RedirectToAction("Manage");
}
TempData讯息仅适用于 current request ,并会在刷新后消失。
可能需要进一步调整,但这将是向用户/客户报告此类错误的方向。