Использование TempData для передачи деталей между действиями контроллера - плохая практика? - PullRequest
4 голосов
/ 30 сентября 2011

У меня есть определенные ситуации, когда мне нужно передать значение между действиями контроллера.

  1. При передаче returnUrl из представления во все вложенные представления .В представлении у меня есть

    @{
       TempData["returnURL"] = Request.Url.AbsoluteUri;
    }
    

    , а затем доступ к нему аналогично этому (в моей реальной версии я проверяю, что ключ находится в TempData и что returnURL является реальным URL):

    return Redirect(TempData["returnURL"].ToString());
    

    Если необходимо продолжить после первого изменения страницы (т. Е. Страницы поиска -> Редактировать страницу -> Редактировать страницу раздела), я добавляю ее снова

    TempData["returnURL"] = TempData["returnURL"];
    
  2. Когда мне нужно передать значение из одного действия контроллера через представление в другое действие контроллера, которое вызывается с помощью ajax, например, здесь:

    public ViewResult Index(FormCollection form)
    {
       var model = new GridColumnChooserViewModel();
    
       //Select deleted/not deleted rows
       if (form.HasKeys())
           model.ShowRows = (form["deletedDropDown"] == null) ? 
                                                     "Active" :
                                                      GetOptionByName(form["deletedDropDown"]);
    
       TempData["ShowRows"] = model.ShowRows;
       ...
    }
    

    и затем в моем другом ajaxназываемый контроллер действия Я получаю к нему доступ:

    public JsonResult GetData()
    {
       //Select deleted/not deleted rows
       var showRows = (TempData.ContainsKey("ShowRows") && TempData["ShowRows"] == null) ?
                                               "Active" :
                                               GetOptionByName(TempData["ShowRows"].ToString());
    
       //refresh tempdata showrows so it is there for next call
       TempData["ShowRows"] = model.ShowRows;
    
       return this.GetDataSource(showRows);
    }
    

Мой вопрос: действительно ли это плохая практика?Насколько я понимаю, я, по сути, использую TempData как сессионный cookie.Есть ли лучший способ сделать это, например, использовать настоящий файл cookie?

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

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

В идеале вы должны передавать любое предстоящее состояние клиенту, а клиент хранит его (в каком-то виде JSON или где-либо еще). Затем клиент вернет его вам как часть своего действия, а затем вы вернете соответствующее состояние и т. Д .; это больше говорит о природе HTTP-приложений без состояния.

1 голос
/ 30 сентября 2011

Да, я бы сказал, что это вообще плохая практика. Несмотря на то, что словарный подход ViewData является быстрым и довольно простым в реализации, он может привести к опечаткам и ошибкам, которые не обнаруживаются во время компиляции. Альтернативой может быть использование шаблона ViewModel, который позволяет вам использовать строго типизированные классы для конкретного представления, в котором вам необходимо представить значения или содержимое внутри. В конечном итоге, вы получите безопасную проверку типов и времени компиляции вместе с intellisense.

Мой первый выбор - использовать модель представления. Если это не подходит, тогда можно просто использовать состояние сеанса.

0 голосов
/ 30 сентября 2011

Я изменил обе ситуации, чтобы использовать Session, чтобы мне не приходилось постоянно нажимать на значение TempData.

public ActionResult Create()
{
    Session["returnURL"] = Request.UrlReferrer.AbsoluteUri;
    ...
}

Затем я получаю к нему доступ вот так

var returnURL = (Session["returnURL"] != null) ? Session["returnURL"].ToString() 
                                               : Url.Action("Index", "Home");

Кажется, немного лучше.

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