【问题标题】:Better Way to Build jQuery Tabs构建 jQuery 选项卡的更好方法
【发布时间】:2010-07-13 17:55:11
【问题描述】:

我在 ASP.NET MVC 2 Web 应用程序中使用 jQuery UI 选项卡。应用程序的一部分要求我在离开选项卡时进行错误检查。我正在通过包含选项卡的 aspx 文件中的此脚本来执行此操作。

<script type="text/javascript">
    $(function () {
        $("#tabs").tabs({
            cache: true,
            select: function (event, ui) {
                var $tabs = $('#tabs').tabs();
                switch ($tabs.tabs('option', 'selected')) {
                    case 0:
                        $.post("User/Personal", $("#PersonalForm").serialize(), function (data, success) {
                            if (success) {
                                $("#PersonalForm").html(data);
                            }
                        });
                        break;

                    case 1:
                        $.post("User/Account", $("#AccountForm").serialize(), function (data, success) {
                            if (success) {
                                $("#AccountForm").html(data);
                            }
                        });
                        break;

                    default:
                        break;
                }

                return true;
            },
            ajaxOptions: {
                error: function (xhr, status, index, anchor) {
                    $(anchor.hash).html("Couldn't load this tab. We will fix this as soon as possible.");
                }
            }
        });
    });
</script>

还有其他 switch 语句(为简洁起见已删除)。基本上,此代码允许通过数据注释在选项卡上进行 MVC 验证 - 工作得非常好。无论如何,我想知道是否可以根据文档中的任何选项卡“生成”此代码。 (如果不是,我基本上必须在 switch 语句中手动编写 case 语句,这似乎有点浪费。)

另外,作为旁注,我对每个选项卡使用 ASP 控件来保存各种数据(这也是各个表单所在的位置)。这可能会对解决方案产生影响。

【问题讨论】:

  • 所有标签的内容是否属于同一类型,例如包含一个表单 (PersonalForm, AccountForm) 等,并且该表单的 action 指向应该将 $.post() 发送到哪里进行验证?
  • @Simen - 每个选项卡都包含一个表单,并且选项卡的集合代表一个完整的用户。 (您在上一页中选择了一个用户,然后您会看到一系列允许您输入用户的选项卡。)当我发送单个表单时,它对应于控制器类中的一个方法(选项卡中的每个表单都有一个方法)。这能说明问题吗?
  • 有点 - 看看我的回答,看看它是否能解决你的问题 :)

标签: jquery jquery-ui asp.net-mvc-2


【解决方案1】:

当用户离开选项卡时,此代码会遍历您要离开的选项卡上的每个表单,并像在您的代码中一样发送一个 ajax 请求。不同之处在于它根据表单的action 属性确定将其发送到何处,而不必在 switch 语句中指定。这意味着PersonalForm 的动作属性必须是User/Personal 等等。

select: function(e, ui) {
    var tab_index = $('#tabs').tabs('option', 'selected');
    var panel_id = $("ul li a:eq(" + tab_index + ")", this).attr("href");
    var panel = $(panel_id); //the content of the tab

    //For each form in the panel, submit it via AJAX and update its html according to the answer
    $(panel).find("form").each(function() {
        var that = this;
        $.post( $(this).attr("action"), $(this).serialize(), function(data, success) {
            if (success) {
                $(that).html(data);
            }
        });
    });
}

当然,如果页面上的表单不超过一个,您可以跳过each,如果只有某些表单应该以这种方式提交,您可以向它们添加一个类来过滤选择

【讨论】:

  • 完美!正是我想要的。感谢您的帮助。我一直在学习 jQuery,我明白它为什么如此受欢迎。 (您的解决方案也帮助我解决了另一个 jQuery 问题。)
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多