なぜこの問題が発生しているのかを理解しようとして、髪を引き裂いています。データを更新するためのポップアップフォームとしてjQuery-uiモデルダイアログボックスを使用しています。これは、実際のフォームを含むダイアログdiv内にdivを配置しようとするまでは、問題なく機能します。モーダルを開くことは正常に機能しますが、「キャンセル」ボタンを押すと、JavaScriptコンソールで次のエラーが発生します。
Uncaught TypeError: Object [object Object] has no method 'dialog'
また、ウィンドウが閉じることはありません。最後に、モーダルの右上にある[X]ボタンを押すと、ウィンドウは正常に閉じますが、モーダルを再度開こうとすると同じエラーが発生します。
関連するコードは次のとおりです。
ビュー内のDiv:
<div id="TacticInstanceModal" title="Update Tactic">
<div id="addEditTacticsInstanceContent">
</div>
</div>
ダイアログを初期化し、inner-divにデータを入力するJavascript:
var addEditTacticInstance = '@Url.Action("Edit", "TacticInstance")';
$('#updateTacticInstanceButton').live("click", function () {
$('#TacticInstanceModal').dialog({
resizable: false,
modal: true,
buttons: {
Save: function () {
$(this).dialog("close");
SaveTacticInstance();
},
Cancel: function () {
$(this).dialog("close");
}
}
});
$.get(addEditTacticInstance,
{ id: $(this).parent().parent().find('.tacticInstanceIdField').val() },
function (data) {
$('#addEditTacticsInstanceContent').html(data);
});
});
部分ビューをロードするアクション:
public ActionResult Edit(int id = 0)
{
try
{
TacticInstance ti = null;
if (id != 0)
{
ti = tacticInstanceRepository.GetSingle(x => x.TacticInstanceId == id);
ti.Tactic = tacticRepository.GetSingle(t => t.TacticId == ti.TacticId);
}
else
{
ti = new TacticInstance();
ti.TacticInstanceId = 0;
}
TacticInstanceViewModel tacticInstance = new TacticInstanceViewModel
{
TacticId = ti.TacticId,
TacticInstanceId = ti.TacticInstanceId,
StartDate = ti.StartDate,
EndDate = ti.EndDate,
CompletedDate = ti.CompletedDate,
PropertyEnrollmentId = ti.PropertyEnrollmentId,
TacticName = ti.Tactic.Name
//TODO: Implement Assets
};
return PartialView("_AddEdit", tacticInstance);
}
catch (EntityException e)
{
ErrorSignal.FromCurrentContext().Raise(e);
return View("Error");
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
return View("Error");
}
}
部分図:
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
@Html.Hidden("TacticInstance_TacticId", @Model.TacticId)
@Html.Hidden("TacticInstance_InstanceId", @Model.TacticInstanceId)
@Html.Hidden("TacticInstance_PropertyEnrollmentId", @Model.PropertyEnrollmentId)
<div class="editor-label">
@Html.LabelFor(model => model.TacticName, new { @style= "font-weight:bold" } )
</div>
<div class="editor-field">
@Html.Label("TacticInstance_Name", Model.TacticName.ToString(), new { id = "TacticInstance_Name" })
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StartDate, new { @style= "font-weight:bold" } )
</div>
<div class="editor-field">
@Html.Label("TacticInstance_StartDate", String.Format("{0:MM/dd/yyyy}", Model.StartDate), new { id = "TacticInstance_StartDate" })
</div>
<div class="editor-label">
@Html.LabelFor(model => model.EndDate, new { @style= "font-weight:bold" } )
</div>
<div class="editor-field">
@Html.Label("TacticInstance_EndDate", String.Format("{0:MM/dd/yyyy}", Model.EndDate), new { id = "TacticInstance_EndDate" })
</div>
<div class="editor-label">
@Html.LabelFor(model => model.CompletedDate, new { @style= "font-weight:bold" } )
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.CompletedDate, new { id = "TacticInstance_CompletedDate" })
@Html.ValidationMessageFor(model => model.CompletedDate)
</div>
Html.EndForm();
}
これについて最も奇妙なことは、javascriptでajax .getをコメントアウトしても、生成された部分ビューHTMLをビューのdivにコピーして貼り付けると、問題なく機能することです。これは、問題がどこかにあると私に信じさせますが、私はhtmlを無駄に注入する複数のテクニックを試しました。