如何从视图中获取状态数据到控制器?

时间:2014-04-25 13:22:27

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

我对MVC很新,并且对MVC中维护状态有一些疑问:

1:我知道控制器可以通过ViewBag,ViewData等向视图提供状态数据,但是如何从视图中将此状态数据返回给控制器?看起来使用ViewBag等只是单程旅行,对维持状态没有好处。

2:用MVC是否使用Session不赞成或被视为管理状态的“旧方法”?如果是这样,如何在没有像Session这样的“全局”工具的情况下管理状态。

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

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

2 个答案:

答案 0 :(得分:0)

  1. ViewBag确实是单向的。它并不是为了保持数据的持久性,坦率地说,应该几乎完全避免使用它。除了极少数例外,使用视图模型可以更好地完成您认为可能需要ViewBag的任何内容。

  2. 不知道你在哪里认为会话不受欢迎,或者是一些旧的方式"。会话是网络上保存状态的方式,没有别的。您如何处理会话是有争议的(cookie,内存,数据库保持等),但一般情况下使用会话没有任何问题。

  3. (作为上述#2的警告,值得一提的是我在网站或应用程序方面的发言。如果您正在谈论API,那么#&# 39;一个完全不同的蠕虫.API,至少那些遵循REST约定的API,完全阻止会话。会话是REST的对立面,其中包括依赖TCP等协议的无状态特性。)

答案 1 :(得分:0)

实际上,您使用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一样保护状态,在需要安全性的网站(例如银行网站)中,则强烈建议会话,如果不是唯一可接受的话。

会话是一种工具,与大多数工具一样,如果被滥用则不受欢迎。

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

管理州的方法