MVC JQuery太快加载了

时间:2012-03-30 14:59:47

标签: jquery visual-studio-2010 asp.net-mvc-3 jquery-ui-dialog partial-views

我正在使用MVC3和Entity Framework。我在页面上有一个列表,其中包含用于选择多个项目的复选框。 (目标是一次“重新分配”倍数)。

当用户单击“重新分配”按钮时,它会调用JQuery对话框以显示它并加载局部视图。在局部视图中,我有一个隐藏字段用于选中的复选框。

一个例子是:

<input type="hidden" value="2,4,5" class="tasks" name="tasks" />

但是,我的代码运行得太快,JQuery无法抓取选中的复选框。当我在Firebug中查看对话框HTML时,该值为空。

我通过以下方式测试了我的代码:

    var checkeditems = $('input:checkbox[name="selectedObjects"]:checked').map(function () { return $(this).val() }).get().join(",");
    alert(checkeditems);
    $('input.tasks').val(checkeditems);

奇怪的是,这些值被放入隐藏的字段中。没有警报,他们就不在那里。

这是我的Javascript:

$('#ReAssign').bind('click', function (event, ui) {
    GetReassign();
    return false;
});

function GetReassign() {
    $("#ReassignDialog").dialog({
        height: 315,
        width: 525,
        modal: true,
        draggable: false,
        resizable: false,
        open: function (event, ui) {
            $(this).load('/InterviewFollowup/ReassignPartial');
        },
        buttons: {
            Ok: function () {
                $(this).dialog("close");
            }
        }
    });

    var checkeditems = $('input:checkbox[name="selectedObjects"]:checked').map(function () { return $(this).val() }).get().join(",");
    $('input.tasks').val(checkeditems);
}

以下是我的观点:

@using (Html.BeginForm("ReassignPost","InterviewFollowup")) {
<fieldset>
    <legend><strong>Re-Assign Task</strong></legend>

    <input type="hidden" value="" id="tasks" class="tasks" name="tasks" />

    <div class="editor-label">
        Location:
    </div>
    <div class="editor-field">
        @Html.DropDownList("MailCodes", (SelectList)ViewBag.MailCodes,"-- Select --")
        @Html.ValidationMessage("MailCodes") 
    </div>

    <br />

    <div class="editor-label">
        @Html.LabelFor(model => model.AssignedTo)
    </div>
    <div class="editor-field">
        <select name="AssignedTo" id="AssignedTo"></select>
    </div>

    <div class="editor-label">
        Notes:
    </div>
    <div class="editor-field">
        <input type="text" name="Notes" id="Notes" />
        @Html.ValidationMessage("Notes") 
    </div>

    <p>
        <input type="submit" value="Submit" />
        <input type="button" value="Cancel" />
    </p>

</fieldset>
}

2 个答案:

答案 0 :(得分:2)

.load() jQuery函数是异步的(它是一个AJAX调用),所以这段代码:

var checkeditems = $('input:checkbox[name="selectedObjects"]:checked').map(function () { return $(this).val() }).get().join(",");
$('input.tasks').val(checkeditems);

在加载部分视图之前运行,因此您的$('input.tasks')选择器与元素不匹配 - 添加警报会修复此问题,因为它会延迟下一行的执行,直到 之后> AJAX调用已完成。您希望将代码移动到.load()完成时的回调函数中,如下所示:

$(this).load('/InterviewFollowup/ReassignPartial', function() {
    var checkeditems = $('input:checkbox[name="selectedObjects"]:checked').map(function () { return $(this).val() }).get().join(",");
    $('input.tasks').val(checkeditems);
});

答案 1 :(得分:1)

我猜你在完成加载之前正在访问一些DOM元素。我会包装你的代码 准备好文件

$(function(){

   $('#ReAssign').bind('click', function (event, ui) {
       GetReassign();
      return false;
   });

});

http://api.jquery.com/ready/

http://docs.jquery.com/Tutorials:Introducing_$(document).ready()

从上页

  

这是第一个了解jQuery的事情:如果你想要一个事件   在你的页面上工作,你应该在$(document).ready()中调用它   功能。加载DOM后,它内部的所有内容都会加载   并且在加载页面内容之前。