【问题标题】:How to Avoid Losing the State of Controls in ASP.NET MVC如何避免丢失 ASP.NET MVC 中的控件状态
【发布时间】:2011-05-19 13:41:19
【问题描述】:

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

  • 该应用程序处理工单和 有一个工单索引视图。这 视图有一个列出工作的表格 订单和几个控件(文本 框、复选框和下拉菜单 列表)来选择标准 要显示哪些工单。

  • 我正在使用视图模型。工单 索引视图有一个视图模型 每个属性 控制。

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

  • 如果我加载页面但没有 操纵任何控件,我可以 点击页码 ActionLinks 并在两者之间移动就好了 工单页。但是,如果我 改变一些东西,我的改变丢失了 当我导航到另一个页面时。

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

我理解为什么会发生这种情况,但我想知道从设计的角度来看最好的做法是什么。

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

  1. 将所有控制值设置为路由 ActionLinks 中的值。这 看起来真的很讨厌,可能会导致 在很长的 URL 或查询字符串中。 实际上,现在我想到了,如果没有捕获控件值的方法,这是行不通的。

  2. 由于 ActionLinks 不发布 任何东西,用按钮替换它们。 同样,这似乎是个坏主意。

  3. 将 ActionLinks 更改为链接 触发一个执行以下操作的 jQuery 脚本 邮政。我觉得这是最 到目前为止有希望的选择。做很多 开发者是这样做的?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 不,我不想将控件的状态存储在数据库中;那将是低效的。但是,我最终还是使用了 jQuery。
    【解决方案2】:

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

    <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();
        });
    
    });
    

    问题解决了。

    【讨论】:

      【解决方案3】:

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

      1) 在 {ie -- an array of json objects} 中找出需要捕获的数据和数据格式 2) 设置处理 prev/next 的链接以触发一个方法来收集“更改”的内容并将它们填充到对象和隐藏字段中。
      3) 发布表单时,解析隐藏字段,提取数据和利润。

      【讨论】:

      • 请看我上面的回答。我所做的与此有些相似,除了由于 ASP.NET MVC 的“约定优于配置”而大部分是自动的。隐藏字段(以及来自控件的所有其他字段)在视图模型中具有相应的属性。所以当我提交时,它们会自动链接起来。
      • 是的,有点类似,但是您仍然有效地 POST GET 请求,这有点自欺欺人。
      • 我不知道您发布 GET 请求是什么意思。我肯定在做一个帖子 - 操作方法甚至用 HttpPost 属性装饰。据我了解,不涉及 GET。
      猜你喜欢
      • 2011-06-12
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      相关资源
      最近更新 更多