MVC 和 ASP.Net Web 表单:视图状态?

Con*_*ner 2 asp.net asp.net-mvc webforms asp.net-mvc-3 asp.net-mvc-4

我使用过 ASP.Net Webforms。我目前正在学习 MVC,并且我读到 ASP.NET MVC 生成的页面不包含任何视图状态数据。有人可以解释什么是 MVC 中视图状态的替代品吗?他们怎么消除了viewstate?由于控件也有视图状态,那么在这种情况下有什么替代方法呢?

Sun*_*nny 5

在webforms中,第一页加载是通过IsPostback属性来区分的,服务器控件基本上都是用Page_Load事件中的数据或初始值来初始化的。这些初始设置将保留在页面的后续回发事件中。您可能已经知道,所有这些都是由 viewstate 完成的,viewstate 基本上是一个隐藏变量,包含页面上所有服务器控件的状态,并为每个回发事件回发。

MVC 没有这种机制并且是完全无状态的,即我们需要为每个请求手动分配控件的值。例如:

在 Web 表单中

ASPX 页面:

<asp:TextBox id="txtName" runat="server"/>
<asp:Button id="btnSubmit" Text="submit" onclick = "btnSubmit_click" />
Run Code Online (Sandbox Code Playgroud)

背后的代码

protected void Page_Load(object sender, EventArgs e)
{
   if(!IsPostback)
   {
       txtName.Text = "test1";
   }
}

protected void btnSubmit_click(object sender, EventArgs e)
{
   //some code
}
Run Code Online (Sandbox Code Playgroud)

输入一个值并单击提交按钮,由于视图状态,该值在回发后获得持久化事件。

在MVC中

看法

@using(Html.BeginForm()){
<input id="Name" type="text" name="Name"/>
<input type="submit" value="submit" />
}
Run Code Online (Sandbox Code Playgroud)

控制器

[HttpPost]
public ActionResult Index(FormCollection values)
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

输入一个值并单击提交按钮,由于没有这样的持久化机制,该值不会在回发中持久化。所以我们需要手动实现

看法

@using(Html.BeginForm()){
<input id="Name" type="text" name="Name" value="@ViewBag.Name"/>
<input type="submit" value="submit" />
}
Run Code Online (Sandbox Code Playgroud)

控制器

[HttpPost]
public ActionResult Index(FormCollection values)
{
    ViewBag.Name = values["name"];
    return View();
}
Run Code Online (Sandbox Code Playgroud)

注意:我使用 ViewBag 只是为了展示一个例子,理想情况下我们需要从控制器传递视图模型。

附加输入

除了持久化状态的作用外,ViewState 还可以用于存储值,例如:ViewState["test"] = objectoranyothervalue。在 MVC 中,还有其他用于状态管理的技术,如 ViewBag、ViewData 和 TempData,但不同之处在于它们不会像 ViewState 那样回发到服务器。它们用于将数据从控制器传递到视图。