【问题标题】:MVC & ASP.Net Web Form : Viewstate?MVC & ASP.Net Web 表单:视图状态?
【发布时间】:2013-01-05 06:17:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    在网络表单中

    ASPX 页面:

    <asp:TextBox id="txtName" runat="server"/>
    <asp:Button id="btnSubmit" Text="submit" onclick = "btnSubmit_click" />
    

    后面的代码

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

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

    在 MVC 中

    查看

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

    控制器

    [HttpPost]
    public ActionResult Index(FormCollection values)
    {
        return View();
    }
    

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

    查看

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

    控制器

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

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

    其他输入

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-10
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多