【问题标题】:Structuring complex web forms in ASP.NET MVC在 ASP.NET MVC 中构建复杂的 Web 表单
【发布时间】:2011-06-07 14:36:46
【问题描述】:

在 ASP.NET MVC 中实现复杂表单(其中根据用户输入显示和隐藏表单部分)的好方法是什么?

我的背景是网络表单。我经常被要求构建表单,用户从下拉列表中选择一个选项,从而触发一些新字段的出现。不同的选择可能会导致出现不同的字段集。

过去,我会通过UpdatePanel 和包装器Panel 处理我想要显示或隐藏的字段周围的情况。隐藏字段时自动禁用验证。

接下来,我想利用 MVC 的基于属性的模型验证,但是否可以根据其他属性的值进行验证?

另外,如何处理表单字段块的切换?我知道如何在 jQuery 中手动完成,但我希望有一种与验证和服务器端代码相关的方法。

我总体上更喜欢 MVC,但我还没有弄清楚如何很好地处理这种类型的场景。可能我只需要转变思路以更好地适应 MVC 方法。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    乔希,

    我建议的第一件事是确保对模式复杂的页面使用 ViewModel。 ViewModel 基本上是您为特定视图创建的模型;例如,一个 ViewModel 可以是其他类的组合。

    至于动态更改视图上的字段,最好的方法是使用 jQuery(或任何其他 javascript 库)来完成。

    我也是从 Web 表单环境迁移过来的,我知道一开始很难换档,但相信我,做一个简单的 jQuery even 处理程序比必须放置一个控制面板和事件处理程序要简单得多.

    更不用说效率更高了;更新面板毕竟是在页面上发布部分帖子,有时,使用 jQuery 你甚至不需要这样做。

    在使用 MVC 进行了一些项目之后,我现在发现在 Web 表单上执行更新面板非常耗时;)

    希望这会有所帮助, -科沃

    【讨论】:

      【解决方案2】:

      我知道这可能不是您要寻找的答案,但我个人并不认为复杂的表单首先对用户很友好,我总是尽可能将它们拆分为更简单的表单,或者简化表格。我在网站上遇到过许多表单,其中有大量“字段”,其中确实应该有一些问题供用户回答。简单的东西可以达到他们想要达到的目的,而不是字段值,以及将这些字段设置为正确值所需的大量应用程序特定知识。

      如果您仍然想继续使用复杂的表单,那么正如其他答案已经说明的那样,MVC 提供了执行此操作的工具,但没有任何固定的方法。因此,您有责任找出最适合您的用户的方法。

      【讨论】:

        【解决方案3】:

        传统的 asp.net 网络表单为您做了很多“魔术”,而您必须了解在 asp.net MVC 中创建“魔术”的工作。好处是使用 MVC,您可以更好地控制正在发生的事情,这也可以提高性能。

        在 asp.net webforms 中,UpdatePanel 用于 ajax 调用。如果您需要异步访问服务器(无需进行完整回发),请通过 JQuery 使用 ajax。见下例:

                    $.ajax({
                            type: "get",
                            url: "/YourController/YourAction",
                            success: function (obj) {
                               //any logic you want to do upon success
                            }
                        });
        

        以上示例将对 /YourController/YourAction 进行 ajax HTTP GET 调用。

        为了处理“块切换”,如果您不需要去服务器获取数据而只是想在客户端上做,那么使用简单的 jquery。 JQuery 具有切换项目的功能。 http://api.jquery.com/toggle-event/

        【讨论】:

          【解决方案4】:

          由于 MVC 的工作方式与 Webforms 相比,您不得不真正思考客户端上发生的事情和服务器上发生的事情,因为没有太多的元数据被传回给我们那种快乐的 Webforms 感觉。

          但是,当您呈现表单时使用内置 AJAX 库时,您可以让它在发布后自动进行更新。从某种意义上说,它为您节省了 JavaScript/JQuery,因为它“自动连接”它类似于面板。通过这种方式,您可能会考虑在编辑每个部分时从服务器逐步呈现复杂的表单,等等。

          参见 MSDN:http://msdn.microsoft.com/en-us/library/system.web.mvc.ajax.ajaxoptions.updatetargetid.aspx

          相关代码示例给你一个想法(不幸的是,它不是更易读的 Razor 语法):

          相关行是呈现表单标签的 Ajax.BeginForm。提交表单后,MS AJAX 库将自动更新在表单的 AjaxOptions 中指定的“UpdateTargetId”中指定的元素。在这种情况下,响应将在服务器回复后放入 SPAN 元素“textEntered”中。在这里,您可以逐步向用户呈现更多内容以供填写,也许是另一个表单等。

          <h2><%= Html.Encode(ViewData["Message"]) %></h2>
          <p>
              Page Rendered: <%= DateTime.Now.ToLongTimeString() %>
          </p>
          <span id="status">No Status</span>
          <br />   
          <%= Ajax.ActionLink("Update Status", "GetStatus", new AjaxOptions{UpdateTargetId="status" }) %>
          <br /><br />
          <% using(Ajax.BeginForm("UpdateForm", new AjaxOptions{UpdateTargetId="textEntered"})) { %>
            <%= Html.TextBox("textBox1","Enter text")%>  
            <input type="submit" value="Submit"/><br />
            <span id="textEntered">Nothing Entered</span>
          <% } %>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-02
            • 1970-01-01
            • 2011-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-05
            相关资源
            最近更新 更多