【问题标题】:MVC3 Partial View modal dialog called twiceMVC3 局部视图模式对话框调用了两次
【发布时间】:2012-07-26 16:34:47
【问题描述】:

在我的模态对话框中添加一个 jQuery 组件时遇到了一个有趣的问题。 jQuery ui 元素(简单的颜色插件,位于http://recursive-design.com/projects/jquery-simple-color/)被渲染了两次!经过调查,我发现模态对话框(即部分视图)本身被渲染了两次。这是我主要观点的相关代码:

// Here is the jQuery:
@section Head
{
    <script type="text/javascript">
        $(document).ready(function () {
            $("#addUserDialog").dialog({ modal: true, autoOpen: false, buttons: [
            {
                text: "Submit",
                click: function() {
                    $("#addUserForm").submit();
                }
            },
            {
                text: "Cancel",
                click: function() {
                    $(this).dialog("close");
                }
            }]
        });

        $('#addUser').click(function () {
            $("#addUserDialog").dialog("open");
        });
    </script>
}

// And here is the rendering of the partial view:
<div id="addUserDialog" title="Add User" style="display:none">
    @Html.Partial("AddUserView", ViewData["user"])
</div>

局部视图模态对话框在这里:

@model UserModel
<script type="text/javascript">
    $(function () {
        alert("addUser");
        $.validator.unobtrusive.parse("#addUserForm");
        $(".colorPicker").simpleColor();
    });

    var closeAddUserDialog = function () {
        $("#addUserDialog").dialog("close");
    };
</script>

@using (@Ajax.BeginForm("addUser",
                        "OnCallControl",
                        new AjaxOptions
                        {
                            HttpMethod = "Post",
                            InsertionMode = InsertionMode.Replace,
                            UpdateTargetId = "userTable",
                            OnSuccess = "closeAddUserDialog"
                        },
                        new { id = "addUserForm" }))
{
    ... // Other form inputs
    <input class="colorPicker" value="#cc3333" />
}

在首次打开页面时会出现两次警报语句。有趣的现象:我有另一个模态对话框,格式相同,有类似的警报语句(例如alert("editUser");),两个警报语句按顺序出现两次(addUser、editUser、addUser、editUser)。

我的怀疑是我在标题和局部视图中合并 jQuery 的方法不好,但我不知道这是否是导致局部视图中的 jQuery 函数执行两次的原因。有没有人知道为什么会这样?如果我的怀疑是正确的,我该如何纠正这种情况?

其他信息:

我确信这个问题来自索引视图或部分对话框视图中的某个地方,因为在视图的初始 GET 请求中没有从其他任何地方调用模式。

当我将对话框声明移至单击事件函数(替换 dialog("open") 命令,删除了 autoOpen: false 选项)时,该对话框在初始 GET 时仅发生一次警报。重复的 jQuery colorPicker 小部件令人费解地仍然存在。

【问题讨论】:

  • 这是一件事......每次使用 .dialog() 初始化 JQuery 对话框时,即将成为对话框的 DIV 都会从 DOM 中剥离出来并复制或移动(不要记住哪个 ) 到页面底部,以确保它不在任何其他子 DIV 下。所以让我问你这个......你有多个地方可以渲染你的标题部分吗?
  • @Shenaniganz 不,只有一个。
  • 你的 renderSection 到底在哪里?
  • @Shenaniganz 在主 _Layout 文件中,在 &lt;head&gt; 标记内。
  • 你能确认你的局部视图中没有布局指针吗? ...我感觉 $("#addUserDialog").dialog( 初始化被调用了两次并试图找出原因

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


【解决方案1】:

我对@9​​87654321@ 命令的功能存在根本性的误解。我不知道如何从主视图访问局部视图的元素。如果在部分视图转换为标记之后 完成,我可以从索引中成功初始化颜色选择器,而不是从部分视图中实例化颜色选择器。这样可以确保对话框中只放置一个颜色选择器。

此解决方案避免了部分视图运行其 javascript 两次的问题。我假设 MVC(在这种情况下)总是通过部分运行两次,一次是在初始标记上,一次是在实际创建对话框时。我想知道是否有办法指示 Visual Studio 在我告诉它之前运行局部视图?

【讨论】:

  • 这样做的方法是不要预先加载你的“对话”部分视图。你可以在你的主视图上有一个空的 div,然后调用 JQuery $('#divName').load('PartialView Path here') 来按需加载你的局部视图,当你真正需要显示它时。跨度>
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多