как поймать исключение представления MVC?

Возможно, это неубедительно, но вы также можете просто указать им обоим на какой-то внешний объект:

var cities = [];

function ParentCtrl() {
    var vm = this;
    vm.cities = cities;
    vm.cities[0] = 'Oakland';
}

function ChildCtrl($scope) {
    var vm = this;
    vm.cities = cities;
}

Преимущество в том, что изменения в ChildCtrl теперь распространяются на данные в родительском объекте.

12
задан John Topley 2 July 2009 в 14:53
поделиться

5 ответов

Рассмотрите возможность использования Elmah: http://code.google.com/p/elmah/

2
ответ дан 2 December 2019 в 20:41
поделиться

Simply add the [HandleError] attribute to the top of your Controller class. This way, any exception generated by your Controller will be handled and the user will be presented /Views/Shared/Error.aspx. The model passed to that view is a System.Web.Mvc.HandleErrorInfo object.

The controller:

[HandleError]
public class MyController : Controller
{
  public ActionResult Default()
  {
    MyClass thing = MyClassFactory.Create();
    return View(thing);
  }
}

This is a for "last resort" exception handling. David's answer is best for those cases you can think of ahead of time.

4
ответ дан 2 December 2019 в 20:41
поделиться

Эта логика должна обрабатываться внутри вашего Контроллера, а не представления. Например, если вы пытаетесь просмотреть продукт с несуществующим MyID, выполните перенаправление на страницу с ошибкой.

Если произошла ошибка, вы также можете выполнить перенаправление в представление InvalidProduct, которое предоставит более подробное описание / инструкции ошибки.

Изменить: в дополнение к комментариям людей ниже, чтобы отловить необработанные исключения, добавьте атрибут [HandleError] либо в объявление метода ActionResult, либо в контроллер (для всех ActionResults).

[HandleError]
public ProductsController
{
    public ActionResult Show(int id)
    {
        Product p = //e.g. get product from db

        if (p == null)
        {
            return RedirectToAction("Error");
            //return RedirectToAction("InvalidProduct");
        }

        return View(p);
    }
2
ответ дан 2 December 2019 в 20:41
поделиться

Ну, вы не всегда можете отловить каждую ошибку в контроллере, но, надеюсь, ваши представления должны быть достаточно легкими, где это очень маловероятно.

Однако, если исключение все же будет сгенерировано в представлении у вас должна быть настроена настраиваемая страница ошибок 500 для перенаправления пользователя на всякий случай. Я считаю, что вы можете настроить такое перенаправление в Global.asax или это также может быть настройка IIS.

1
ответ дан 2 December 2019 в 20:41
поделиться

Хотя я поддерживаю ответ Дэвида Лиддла («Эта логика должна обрабатываться внутри вашего Контроллера, а не представления»), я также могу сказать вам, что вы должны кодировать защитно в целом.

Например, вместо

try
{
    Html.Encode(Model.MyID)
}
catch
{
    Response.Redirect("~/Error/500");
}

вы должны

if (Model == null)
{
    // ...
}
else
{
    //.....
}

(конечно, опять же, не помещайте логику выбора представления в представление)

2
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: