显示基于表的视图中的操作的错误

时间:2010-06-11 14:36:29

标签: asp.net asp.net-mvc asp.net-mvc-2 asp.net-4.0

我有一个视图,我想对表格中每行中的项目执行不同的操作,类似于此(在~/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) %>
<% } %>

谢谢!

2 个答案:

答案 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 ,并会在刷新后消失。

可能需要进一步调整,但这将是向用户/客户报告此类错误的方向。