在创建一个自定义插件时,该插件会通过不显眼的 Ajax 对尚未 Ajaxified 的form
任何s进行 Ajax 化,我注意到我的部分/布局代码无法使用正常的 Unobtrusive Ajax 表单在回发时显示:
对于我的其他部分更新插件,我有条件地将页面呈现为部分(对于 ajax 请求)或完整的布局(对于正常请求),如下所示:
public ActionResult AjaxForm()
{
if (!Request.IsAjaxRequest())
{
ViewBag.Layout = "_Layout.cshtml";
}
return PartialView();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AjaxForm(AjaxFormModel model)
{
if (!Request.IsAjaxRequest())
{
ViewBag.Layout = "_Layout.cshtml";
}
if (ModelState.IsValid)
{
return PartialView("Success", model);
}
return PartialView(model);
}
在测试一个普通的不显眼的 Ajax 表单时,我使用了这个测试视图,它只更新了它自己的元素UpdateTargetId="FormPanel"
:
@using (Ajax.BeginForm("AjaxForm", null, new AjaxOptions() { UpdateTargetId = "FormPanel" }, new { id = "FormPanel" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.AddressLine, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.AddressLine, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
如果我删除 testif (!Request.IsAjaxRequest())
并返回带有母版页/布局的完整页面,它会在表单所在的位置呈现结果。
Fiddler 显示在任何一种情况下都会返回“成功”视图,但如果没有布局,它不会做任何事情。
问:不显眼的 Ajax 需要在母版页/布局中提取内容并替换指定元素
更新:
更糟糕的是,它实际上第一次正常工作,但如果我再次加载相同的表单,则不会。