отображение ошибок от действий в табличных представлениях - PullRequest
0 голосов
/ 11 июня 2010

У меня есть представление, в котором я хочу выполнить различные действия с элементами в каждой строке таблицы, например, (например, ~/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 небольших форм на странице. Этот подход в основном взят из этой статьи, но он не обрабатывает ошибки так, как мне нужно.

Кто-нибудь принимает?


Решено благодаря @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 голосов
/ 11 июня 2010

Давайте попробуем ...

Для таких вещей доступен словарь 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 доступно только для текущего запроса и исчезнет после обновления.

Возможно, потребуется дополнительная доработка, но именно в этом направлении пользователю и клиенту следует сообщать об ошибках такого рода.

0 голосов
/ 11 июня 2010

Попробуйте сделать:

 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 для отправки формы на сервер, поэтому вы не всегда перезагружаете страницу и выводите сообщение на клиенте.

НТН.

...