如何避免在ASP.NET MVC中丢失控件状态

时间:2010-12-03 05:32:35

标签: asp.net-mvc asp.net-mvc-2 viewmodel actionlink

我正在使用ASP.NET MVC 2并构建一个简单的业务应用程序。以下是一些细节:

  • 该应用处理工单和 有工作订单索引视图。该 view有一个列出工作的表 订单和几个控件(文本 盒子,复选框和下拉菜单 列表)选择标准 哪个工单要显示。

  • 我正在使用viewmodels。工单 index视图有一个viewmodel 每一个属性 控制。

  • 我实现了类似的分页 在答案中做了什么 这个问题: How do I do pagination in ASP.NET MVC? 我正在使用LINQ的Skip()和Take() 演示,和ActionLinks 导航

  • 如果我加载页面而不是 我可以操纵任何控件 单击页面编号ActionLinks 并在两者之间移动 工作单页面。但是,如果我 改变一些事情,我的改变就失去了 当我导航到另一页时。

    例如,如果我在第1页和 单击未选中的复选框,然后 然后点击第2页的链接, 第二页结果将加载 但复选框将恢复为其 以前的状态。

我明白为什么会这样,但我想知道从设计的角度来看,最好的做法是什么。

我能想到的潜在解决方案:

  1. 将所有控制值设置为路径 ActionLinks中的值。这个 看起来真的很讨厌,可能会导致 在非常长的URL或查询字符串中。实际上,现在我想起来,如果没有捕获控制值的方法,这将无法工作。

  2. 由于ActionLinks不发布     什么,用按钮替换它们。     再次,这似乎是一个坏主意。

  3. 将ActionLinks更改为链接     触发一个执行a的jQuery脚本     POST。我认为这是最多的     迄今为止有希望的选择做很多     开发人员这样做?

  4. 这似乎是一个很常见的问题,但这些选项都不是很正确。我想知道我是否遗漏了什么。

3 个答案:

答案 0 :(得分:0)

当用户切换复选框时(使用jQuery),您不能将更改保存回数据库:

$("input[type=checkbox]").click(function() {
     $.ajax({
          type: "POST",
          url: "/ControllerName/SaveInfo?id=" + {id},
          success: function(){
                alert("Data Saved: " + msg);
          }
     });
});

答案 1 :(得分:0)

最后,我最终摆脱了用于分页的ActionLinks,并用常规锚标签替换它们。现在的页面索引现在存储在隐藏的表单值中:

<input id="page" name="page" type="hidden" value="" />

<p>
    <% for (var i = 1; i <= (int)Math.Ceiling(Model.RowsMatchingCriteria / (double)Model.PageSize); i++) { %>

        <%--
            If the page number link being rendered is the current page, don't add the href attribute.
            That makes the link non-clickable.
        --%>
        <a class="pageLink" <%= i != Model.Page ? @"href=""javascript:void(0);""" : string.Empty %>><%: i %></a>

    <% } %>
</p>

然后我添加了以下jQuery脚本,它设置隐藏页面值并在单击链接时提交表单:

$(document).ready(function () {

    $('.pageLink:[href]').click(function () {
        $('#page').val($(this).text());  // Set hidden field value to the text of the page link, which is the page number.
        $('form:first').submit();
    });

});

问题解决了。

答案 2 :(得分:0)

最好的办法是通过在用户分页时将更改“记录”到隐藏字段来有效地模拟视图状态。为此:

1)确定需要捕获的数据以及在{ie - json对象数组}中执行此操作的数据格式 2)设置处理prev / next的链接,关闭一种方法,以收集“已更改”的东西,并将它们填充到对象和隐藏的字段中。
3)发布表单时,解析隐藏字段,提取数据和利润。