如果有人可以提供帮助,我会很感激。
我想根据用户类型返回不同的部分视图:
[HttpPost]
public ActionResult Edit(ContractModel model)
{
if(ModelState.IsValid)
{
if (curUser.IsInputer) { .... return View("Contracts");}
else if(curUser.IsAuthorizer) { ..... return View("Details");}
}
return PartialView(model);
}
查看:
@{
string updateRegion = "";
if (curUser.IsInputer)
{
updateRegion = "content";
}
else if (curUser.IsAuthorizer)
{
updateRegion = "mainPane";
}
}
<script>
function returnViewOnFailure(result) { //not firing on submission failure
$("#mainPane").html(result);
}
</script>
@using (Ajax.BeginForm("Edit", new AjaxOptions() { UpdateTargetId = updateRegion,
InsertionMode = InsertionMode.Replace,
OnFailure = "returnViewOnFailure" }))
{.........}
问题是当ModetState.IsValid
= false
我的函数returnViewOnFailure
未触发时。
如果表单提交失败(无论用户类型如何),我希望UpdateTargetId
为"mainPane"
,否则它应该取决于curUser
。
修改
因此,我建议使用ajax调用来汇总表单:
<script>
var form = $('#contract_form');
form.submit(function (ev) {
$.ajax({
cache: false,
async: true,
type: "POST",
url: form.attr('action'),
data: form.serialize(),
success: function (data) {
$("#content").html(data);
//How to check ModelState.IsValid and show errors?
}
});
ev.preventDefault();
});
答案 0 :(得分:1)
因为验证是在服务器端完成的,所以您可以设置响应的状态代码(Controller.Response)。
如果验证失败,请将其设置为500(内部服务器错误),以便调用ajax.onfailure。将validationerror逻辑(替换divs内容)放在那里。或者你甚至可以在onfailure中更改updatetargetid(通过javascript)。