【问题标题】:Is using TempData to pass details between controller actions bad practice?使用 TempData 在控制器操作之间传递详细信息是不好的做法吗?
【发布时间】:2011-09-30 00:22:16
【问题描述】:

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

  1. 将 returnUrl 从视图传递到所有嵌套视图时。在里面 查看我有

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

    然后以与此类似的方式访问它(在我的真实版本中,我 检查密钥是否在 TempData 中并且 returnURL 是真实的 网址):

    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?

【问题讨论】:

  • 仅供参考 - FormCollection 已弃用。
  • 视图设置任何东西也是一个坏主意。
  • 它在哪里说 FormCollection 已弃用?在 MSDN 上没有提及:msdn.microsoft.com/en-us/library/….
  • 使用强类型模型是一种更好的做法。

标签: c# .net asp.net-mvc razor


【解决方案1】:

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

我的第一选择是使用视图模型。如果这不合适,那么使用会话状态可能就可以了。

【讨论】:

    【解决方案2】:

    您似乎正在使用TempData 在您网站的各个页面中流动状态;一般来说,我会说这是一种不好的做法。

    理想情况下,您可以将所需的任何即将到来的状态传送给客户端,然后客户端将其存储(以某种 JSON 或其他格式)。然后,客户端会将其作为其操作的一部分返回给您,然后您将传回适当的状态等;它更多地说明了 HTTP 应用程序的无状态特性。

    【讨论】:

      【解决方案3】:

      我将这两种情况都更改为使用Session,这样我就不必继续推动TempData 的值了。

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

      然后我这样访问它

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

      看起来好多了。

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        相关资源
        最近更新 更多