TempData & Redirect для ошибок - PullRequest
       3

TempData & Redirect для ошибок

0 голосов
/ 03 ноября 2011

У меня есть действие контроллера в моем проекте, в котором требуется отображать сообщение об ошибке пользователю при определенных сценариях. Это действие происходит в POST:

[HttpPost]
public ActionResult DoSomeAction() {
    if( someCondition )
        return RedirectToAction("SomeActionError");

    return RedirectToAction("Index");
}

public ActionResult SomeActionError() {
    return View();
}

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

Является ли плохой дизайн / подход для установки какого-либо флага в TempData и перенаправления на другой контроллер, который проверяет наличие флага ошибки TempData?

Пример:

[HttpPost]
public ActionResult DoSomeAction() {
    if( someCondition ) {
        TempData["DoSomeActionError"] = true;            
    }

    return RedirectToAction("Index");
}

public ActionResult Index() {
    // check for error
    if( TempData["DoSomeActionError"] ) {
        return View("SomeActionError");
    }
}

Это плохая идея? Есть ли другой подход, который делает что-то подобное (не позволяет пользователю непосредственно перейти к действию ошибки)? Я не хочу возвращать действие View on POST, потому что я не хочу, чтобы они обновлялись и вызывали еще один POST.

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

TempData само по себе не является плохой концепцией.TempData предназначена для передачи информации некоторому потребителю, который читает эту информацию, и информация должна исчезнуть после того, как она будет прочитана.

То, как вы используете TempData, странно.Более элегантная реализация для ваших требований (вы должны показать сообщение об ошибке) - реализовать эквивалент концепции флеш-памяти rails и не перенаправлять на страницу ошибки, а отображать сообщение об ошибке в представлении индекса.Что-то вроде красного баннера с надписью «Запись не может быть сохранена».

В этом вопросе показана хорошая реализация флеш-памяти, включающая в себя материал для просмотра (не принятый ответ, а ответ @jim)

1 голос
/ 03 ноября 2011

использование tempdata в mvc не очень хороший подход. Если бы я был тобой, я бы сделал следующее:

[HttpPost]
public ActionResult DoSomeAction() {
   if( someCondition ) {
       return RedirectToAction("Index", new{error=true}           
   }

   return RedirectToAction("Index");
}

public ActionResult Index(bool? error) {
    // check for error
    if(error?? false ) {
        return View("SomeActionError");
    }
}
0 голосов
/ 03 ноября 2011

Хотя я не согласен с тем, что TempData всегда плохая (я считаю, что она отлично подходит для сообщений о состоянии, которые я абсолютно не хочу передавать по URL, например, «запись сохранена»), я думаю, что в вашем случае может быть лучший вариант.

Во-первых, вы не хотите, чтобы страница с ошибками была доступна, могу я спросить, почему? Выполнение перенаправления, когда происходит ошибка, только повторное перенаправление немного странно. Я бы бросил исключение и обработал бы это исключение вашим представлением об ошибке MVC автоматически добавляет атрибут [HandleError] в качестве глобального фильтра, поэтому добавьте свое исключение (пользовательский тип при необходимости) и обработайте его на своей странице ошибок, как считаете нужным, так как вы можете получить доступ к деталям исключения и там не требует перенаправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...