【问题标题】:Temporary holding collection of data临时保留数据收集
【发布时间】:2014-04-23 00:56:15
【问题描述】:

在多个控制器之间临时保存和访问数据集合的最佳方法是什么?

例如,view1.cshtml 包含一个带有以下数据项的网格:

--------------------
Name | Address | Age
--------------------
aa   | ad1     | 11
--------------------
bb   | ad2     | 22
-------------------
cc   | ad3     | 33
--------------------

如果用户选择了前 2 行,则选择的行项目需要显示在另一个名为 view2.cshtml 的另一个视图的网格中。用户可以再次返回第一个视图,如果选择一个新的行项目,那么我也想将所选项目附加到第二个视图上显示的网格中。

我尝试过 ViewBag 和 TempData 来临时存储数据。但不幸的是,有时数据会被清除。解决这种情况的最佳选择是什么?

【问题讨论】:

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


    【解决方案1】:

    由于网格上的信息来自某个数据源,很可能是具有唯一标识符的数据库,因此当用户单击行时,我只需将用户重定向到另一个页面并传递所选的 id行。

    在另一个控制器上,您只需检索传入的 id 的数据。

    【讨论】:

    • 我认为这是更好的选择,因为对于 MVC,您应该始终首先考虑无状态方法。
    【解决方案2】:

    一种方法是像这样在动作中传递您的对象:

    return RedirectToAction("ActionName", new { data= items });
    

    控制器动作方法签名可能是这样的:

    public ActionResult LoginFailed(List<T> items)
    {
        ...
    }
    

    另一种方法是这样存储在tempdata中,一次可读,读一次后自动销毁:

    List<AnyType> items = new List<AnyType>();
    
    
    TempData["MyList"] = items;
    

    在其他控制器动作中这样读取:

    List<AnyType> items = (List<AnyType>)TempData["MyList"];
    

    如果您希望在阅读后可以访问它,请调用:

    TempData.Keep("MyList");
    

    【讨论】:

      【解决方案3】:

      我会使用 Session 来存储数据集合,因为您需要在一个或多个控制器之间传递数据。

      保存:

      List<T> items = new List<T>();
      items.Add(T);
      ...
      
      Session["YourCollection"] = items;
      

      获取:

      List<T> items = Session["YourCollection"] as List<T>;
      

      【讨论】:

      • 不要将数据填充到会话中,只是为了在另一个或两个帖子中保留它。这是典型的糟糕设计。
      猜你喜欢
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多