是否正在使用TempData在控制器操作之间传递详细信息?

时间:2011-09-30 00:22:17

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

我遇到某些需要在控制器操作之间传递值的情况。

  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);
    }
    
  3. 我的问题是,这是非常糟糕的做法吗?根据我对它的理解,我基本上使用TempData就像一个会话cookie。有没有更好的方法来实现这一点,比如使用实际的cookie?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

然后我像这样访问它

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

似乎好一点。