我对MVC很新,并且对MVC中维护状态有一些疑问:
1:我知道控制器可以通过ViewBag,ViewData等向视图提供状态数据,但是如何从视图中将此状态数据返回给控制器?看起来使用ViewBag等只是单程旅行,对维持状态没有好处。
2:用MVC是否使用Session不赞成或被视为管理状态的“旧方法”?如果是这样,如何在没有像Session这样的“全局”工具的情况下管理状态。
我在网上搜索了这些问题的答案,但到目前为止只找到了不完整的答案。
此外,如果重要,我正在使用MVC 5和Entity Framework 6。
答案 0 :(得分:0)
ViewBag
确实是单向的。它并不是为了保持数据的持久性,坦率地说,应该几乎完全避免使用它。除了极少数例外,使用视图模型可以更好地完成您认为可能需要ViewBag
的任何内容。
不知道你在哪里认为会话不受欢迎,或者是一些旧的方式"。会话是网络上保存状态的方式,没有别的。您如何处理会话是有争议的(cookie,内存,数据库保持等),但一般情况下使用会话没有任何问题。
(作为上述#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一样保护状态,在需要安全性的网站(例如银行网站)中,则强烈建议会话,如果不是唯一可接受的话。
会话是一种工具,与大多数工具一样,如果被滥用则不受欢迎。
不同类型的州应该通过一种方法来管理,而不是通过许多不同的方法来管理。
管理州的方法