我有一个局部视图,它不仅仅更新局部视图,它还重定向到整个页面的操作。
在局部视图_registerAccount.cshtml中,该视图包含要注册的发布请求,该请求是通过Ajax在名为_registerAccount的视图中发出的,如下所示:
@model LoginDemo.Models.LdapAccountModel
@using (Ajax.BeginForm("RegisterLdapAccount", "Account", new AjaxOptions
{
HttpMethod = "Post",
InsertionMode = InsertionMode.Replace
}))
{
@Html.ValidationSummary()
@Html.LabelFor(x => Model.Email) @Html.TextBoxFor(x => Model.Email, new { id = "reg-ytu-email" })
<br />
@Html.LabelFor(x => Model.Password) @Html.PasswordFor(x => Model.Password, new { id = "reg-pw" })
<input type="submit" value="Register" class="btn" />
}
在父页面中,Register.cshtml我有:
@model LoginDemo.Models.RegisterModel
...
<div class="panel hide register-type register-ytu">
@Html.Partial("_registerAccount")
</div>
在帐户控制器中,ajax请求转到RegisterAccount操作:
[HttpPost]
public async Task<ActionResult> RegisterLdapAccount(LdapAccountModel model)
{
if (model.exists()) // pseudo code
{
return Json(new {foo: "bar"}); // return address to redirect to
}
else
{
ModelState.AddModelError("", "You must have a valid account.");
return PartialView(model); // return error
}
}
我的问题是,返回的所有内容都会擦除整个页面,而不是仅更新父页面中的部分页面。也就是说,如果JSON返回成功,则仅返回JSON;如果失败,则部分视图返回仅返回部分。
n.b。我的web.config中有<add key="UnobtrusiveJavaScriptEnabled" value="true" />
。
答案 0 :(得分:1)
如下修改以下代码:
@using (Ajax.BeginForm("RegisterLdapAccount", "Account", new AjaxOptions
{
HttpMethod = "Post",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "updatearea",
修改div以添加ID:
<div id="updatearea" class="panel hide register-type register-ytu">
@Html.Partial("_registerAccount")
</div>
现在,如果您还没有的话,请确保页面上的脚本具有不可信的Ajax。
<script type="text/javascript" src="@Url.Content("/scripts/jquery.unobtrusive-ajax.min.js")"></script>
要添加此脚本,它必须位于项目的scripts文件夹中。
修改控制器,以便您加载正确的局部视图,如果您未声明局部视图的名称,则加载的局部视图将与操作名称匹配,如果没有局部视图与名称匹配该操作不会加载任何局部视图。因此,像这样明确声明要加载的局部视图:
返回PartialView(“ _ RegisterAccount”,模型)