c# - 使用 TempData 在 Controller 操作之间传递细节是不好的做法吗?

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

在某些情况下,我需要在 Controller 操作之间传递一个值。

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

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

    然后以类似的方式访问它(在我的真实版本中我 检查 key 是否在 TempData 中以及 returnURL 是否真实 网址):

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

    如果它需要在第一页更改之后继续(即搜索 page -> Edit page -> Edit Section page)我又来加了

    TempData["returnURL"] = TempData["returnURL"];
    
  2. 当我需要通过一个 Controller Action 传递一个值时 查看由 ajax 调用的另一个 Controller 操作,例如 这里:

    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 的 Action Controller 中访问它:

    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);
    }
    

我的问题是,这真的是不好的做法吗?根据我对它的理解,我本质上是在像 session cookie 一样使用 TempData。有没有更好的方法来做到这一点,比如使用实际的 cookie?

最佳答案

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

我的第一选择是使用 View 模型。如果这不合适,那么使用 session 状态可能就很好。

关于c# - 使用 TempData 在 Controller 操作之间传递细节是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604778/

相关文章:

.net - IDictionary 到 SelectList?

c# - Gwan C#,如何获取 HTTP header ?

c# - MFC 中的硬件加速

c# - 使用 C# 中的 Windows 服务从 FTP 服务器复制并删除文件

c# - .NET 平台标准中有哪些平台?

java - 在 IDE 中编程时如何停止使用鼠标?

c# - 比较两个 Linq 对象

c# - SQL 数据库中的 Controller 异步/等待死锁

asp.net-mvc - 标签助手中的可选属性

c# - MVC 图表仅显示文本流