Error handling 在父页面上显示有错误的mvc局部视图

Error handling 在父页面上显示有错误的mvc局部视图,error-handling,asp.net-mvc-5,partial-views,Error Handling,Asp.net Mvc 5,Partial Views,我有一个包含多个表单的页面,每个表单都是部分表单。我想在提交时发布每个部分。如果有错误,我希望验证错误作为主页的一部分显示在部分中,也就是说,如果有错误,我不希望只在它自己的页面上看到部分。我说这种行为只有在ajax帖子中才可能发生,对吗?如果没有ajax帖子,仅仅是一篇普通形式的帖子,我如何返回模型状态错误 编辑: 还在自己的页面上看到部分内容吗 部分- @使用(Html.BeginForm(“Login”,“Account”,FormMethod.Post,new{id=“LoginForm

我有一个包含多个表单的页面,每个表单都是部分表单。我想在提交时发布每个部分。如果有错误,我希望验证错误作为主页的一部分显示在部分中,也就是说,如果有错误,我不希望只在它自己的页面上看到部分。我说这种行为只有在ajax帖子中才可能发生,对吗?如果没有ajax帖子,仅仅是一篇普通形式的帖子,我如何返回模型状态错误

编辑: 还在自己的页面上看到部分内容吗

部分-

@使用(Html.BeginForm(“Login”,“Account”,FormMethod.Post,new{id=“LoginForm”}))
{
@Html.ValidationMessage(“InvalidUserNamePassword”)
用户ID
@TextBoxFor(x=>x.Username,新的{@class=“form-field\uuuu-input form-field\uuu-input--text”,@id=“form-field-user\u id”})
登录
}
$(“#登录按钮”)。单击(函数(){
$.ajax({
类型:“POST”,
url:'@url.Action(“登录”、“帐户”),
数据:$('form')。序列化(),
成功:功能(结果){
if(result.redirectTo){
window.location.href=result.redirectTo;
}否则{
$(“#LoginForm”).html(结果);
}
},
错误:函数(){
$(“#LoginForm”).html(结果);
}
});
});
控制器-

[HttpPost]
公共操作结果登录(LoginModel模型)
{
如果(!ModelState.IsValid)
{
返回PartialView(“~/Views/Account/\u Login.cshtml”,model);
}
返回Json(新的{redirectTo=Url.Action(“Index”,“Profile”)});
}

是的,您说这种行为只有在ajax帖子中才可能发生是正确的

您当前的脚本存在一些问题,这意味着您将无法获得所需的结果

首先,您的按钮是一个submit按钮,这意味着它将在ajax调用之外执行正常的submit,除非您取消默认事件(通过添加
return false;
作为脚本中的最后一行代码)。但是,将按钮类型更改为
type=“button”

登录
ajax调用现在将更新现有页面,但是它将在现有的
元素中添加返回的部分,从而生成无效html且不受支持的嵌套表单。更改html以将主视图表单包装到另一个元素中


@使用(Html.BeginForm(“Login”、“Account”、FormMethod.Post、new{id=“LoginForm”}))
{
....
登录
}
然后修改脚本以更新外部元素的html

成功:函数(结果){
if(result.redirectTo){
window.location.href=result.redirectTo;
}否则{
$(“#LoginFormContainer”).html(结果);//修改
}
},
最后,您需要呈现动态内容,以便客户端验证不会对返回的表单起作用。假设您的属性具有验证属性(例如
Userame
属性上的
[Required]
属性),则需要在加载内容后重新分析验证程序

var form=$('#LoginForm');
....
}否则{
$(“#LoginFormContainer”).html(结果);
//重分析验证器
表单数据('验证器',空);
$.validator.unobtrusive.parse(表单);
}
您注意到页面上有多个表单,在这种情况下,您的ajax选项应该是

data:$('#LoginForm').serialize(),
或者如果您的声明
var form=$('#LoginForm')然后
数据:form.serialize(),
以确保序列化的表单正确

旁注:没有必要更改文本框的
id
属性(默认情况下,它将是
id=Username”
,您只需使用

@Html.LabelFor(x=>x.UserName,“用户ID”)
@TextBoxFor(x=>x.Username,新{@class=“form-field\uuuu input form-field\uuuu input--text})

或者只使用
@Html.LabelFor(x=>x.UserName)
属性的
[Display(Name=“User ID”)]

您想在主页面上显示除部分之外的模型状态错误吗?您只需返回表单的部分视图,并在ajax成功回调中用返回的html替换原始表单。我想在部分中显示模型状态错误,但部分必须在主页面上显示,与表单提交之前一样,而不是单独显示@StephenMuecke你能给我一个例子/链接吗?这应该是在局部视图中显示错误的完美例子。