【问题标题】:How to get state data to controller from view?如何从视图获取状态数据到控制器?
【发布时间】:2014-04-25 13:22:26
【问题描述】:

我是 MVC 的新手,对在 MVC 中维护状态有一些疑问:

1:我知道控制器可以通过 ViewBag、ViewData 等向视图提供状态数据,但是如何将这些状态数据从视图中返回给控制器呢?看来使用ViewBag等只是单程旅行,不利于状态维护。

2:在 MVC 中,使用 Session 是否不受欢迎或被视为管理状态的“旧方式”?如果是这样,如果没有像 Session 这样的“全局”工具,如何管理状态。

我在网上搜索了这些问题的答案,但到目前为止只找到了不完整的答案。

另外,如果重要的话,我正在使用 MVC 5 和 Entity Framework 6。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:
  1. ViewBag 确实是单向的。它不是为了数据的持久性而设计的,坦率地说,应该几乎完全避免使用它。除了极少数例外,您认为可能需要ViewBag 的任何事情都最好使用视图模型来完成。

  2. 不知道你从哪里得到的想法是不赞成会话或者是“旧方式”。会话是在网络上保存状态的方式,没有别的。您处理会话的方式有待商榷(cookies、内存中、数据库持久化等),但一般来说使用会话并没有错。

(作为对上述第 2 点的警告,值得一提的是,我说的是网站或应用程序。如果您说的是 API,那是完全不同的蠕虫罐头。API,至少那些遵循 REST 约定的人完全不鼓励会话。会话是 REST 的对立面,它依赖于 TCP 等协议的无状态特性。)

【讨论】:

    【解决方案2】:

    实际上,您使用 ViewBag 发送的数据可以通过 GET 和 POST 参数发送回控制器(它是如何发送回所有数据的)。 More about get and post

    以下是使用 ViewBag(输出)和<input type="hidden" />(输入)来回传递数据的示例

    public class HomeController : Controller
    {
        public ViewResult Edit()
        {
            // Lets send this one, and see if the view can return it.
            ViewBag.UserID = 1; 
    
            return View();
        }
    
        [HttpPost]
        public ActionResult Edit(int userID)
        {
            int userID = userID; // Place a breakpoint here and verify our little test.
            return View();
        }
    }
    
    // This is your view
    @using (Html.BeginForm()) {
    
        <input type="hidden" value="@ViewBag.UserID" />
        <input type="submit" value="Save" />
    }
    

    管理国家

    使用 ViewBag 传递状态并不少见,例如管理页面索引以实现分页功能。在这些情况下,我们不希望仅为与模型没有任何关系的单个属性(PageIndex)创建 ViewModel。只要你的意图很明显,那么我会说keep it simple

    会话的正确使用取决于您尝试维护的状态类型(以及业务需求)。如果您正在使用会话管理 UI 的状态,那么这很糟糕。但是,如果您在银行网站等需要安全性的网站中尝试像用户帐户 ID 一样保护状态,那么强烈建议使用会话(如果不是唯一可以接受的)。

    Session 是一种工具,并且与大多数工具一样,如果被滥用,将不受欢迎。

    不应该通过一种方法来管理不同类型的状态,而应该通过多种不同的方法来管理。

    状态管理方式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多