使用TempData在控制器动作之间传递细节是不好的做法吗?

本文关键字:细节 控制器 TempData 之间 使用 | 更新日期: 2023-09-27 18:10:01

在某些情况下,我需要在控制器动作之间传递一个值。

  1. 当从视图传递一个returnUrl给所有嵌套视图时。在视图

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

    ,然后以类似的方式访问它(在我的实际版本中)检查键是否在TempData中,并且returnURL是否为实值URL):

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

    如果它需要在第一页更改后继续(即搜索)page -> Edit page -> Edit Section page)我再添加一次

    TempData["returnURL"] = TempData["returnURL"];
    
  2. 当我需要从一个控制器动作通过a传递值时视图到另一个由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);
    }
    
我的问题是,这真的是不好的做法吗?从我对它的理解来看,我基本上是像使用会话cookie一样使用TempData。有没有更好的方法来做到这一点,比如使用实际的cookie?

使用TempData在控制器动作之间传递细节是不好的做法吗?

是的,我想说这通常是不好的做法。虽然ViewData字典方法快速且相当容易实现,但它可能导致在编译时无法捕获的错别字和错误。另一种选择是使用ViewModel模式,它允许您为需要在其中公开值或内容的特定视图使用强类型类。最终为您提供类型安全和编译时检查以及智能感知。

我的第一选择是使用视图模型。

似乎你正在使用TempData通过您的网站的各个页面流动状态;总的来说,我认为这是一种不好的做法。

理想情况下,您可以将需要的任何即将到来的状态流到客户端,并且客户端将存储它(以某种JSON或其他形式)。然后,客户端会将其返回给你作为其操作的一部分,然后你会传回适当的状态,等等;

我把这两种情况都改为使用Session,这样我就不必一直把TempData的值推到

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

然后像这样访问

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

看起来好多了