モーダルダイアログにjQueryコンポーネントを追加しているときに、興味深い問題が発生しました。jQuery ui要素(http://recursive-design.com/projects/jquery-simple-color/にあるシンプルなカラープラグイン)が2回レンダリングされていました!調査したところ、モーダルダイアログ(部分ビュー)自体が2回レンダリングされていることがわかりました。これが私のメインビューからの関連コードです:
// 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" />
}
アラートステートメントは、ページを最初に開いたときに2回表示されます。興味深い現象:同じ形式で、同様のアラートステートメント(例alert("editUser");
)を持つ別のモーダルダイアログがあり、2つのアラートステートメントが2回順番に表示されます(addUser、editUser、addUser、editUser)。
ヘッダーとパーシャルビュー内の両方にjQueryを組み込む方法が悪いのではないかと疑っていますが、これがパーシャル内のjQuery関数を2回実行する原因であるかどうかはわかりません。なぜこれが起こっているのかについて誰かが何か考えを持っていますか?私の疑いが正しければ、どうすればこの状況を修正できますか?
追加情報:
ビューの最初のGETリクエストでモーダルが他のどこからも呼び出されないため、この問題はインデックスビューまたは部分ダイアログビューのどこかから発生していると確信しています。
ダイアログ宣言をクリックイベント関数に移動したとき(dialog("open")
コマンドを置き換え、autoOpen: false
オプションを削除した場合)、最初のGETでそのダイアログに対してアラートが1回だけ発生しました。重複したjQuerycolorPickerウィジェットは、やっかいなことにまだそこにあります。