我一直在使用asp.net mvc(但我仍然是一个初学者)。我希望能够更新两个视图作为jquery回发的结果。
基本上我有一个列表和详细信息视图。使用jquery弹出窗口(使用jquery-UI弹出窗口)显示详细信息视图。如果详细信息保存成功,我只想更新列表(即详细信息视图中没有验证错误)。但是,如果详细信息视图中有任何验证错误,我想更新详细信息视图,以便用户看到验证错误。
所以我想在我的控制器中,我返回一个JsonResult而不是View。
[HttpPost]
public ActionResult SavePersonInfo(Person p) {
if(ModelState.Valid) {
return View("PersonList");
}
return Json({Error = true, View = PartialView("PersonDetails", p)});
}
如您所见,如果没有错误,我会返回人员列表视图,但如果有任何验证错误,我会返回详细信息视图。我返回JsonResult的原因是我需要告诉我的视图有一个错误,以便视图(jquery)知道要更新哪个部分(如更新人员列表'div'或弹出对话框'div “)。
所以,在我看来,jquery如下(请假设有一个用于输入人员详细信息的表单,并且“SubmitPersonForm();”函数在单击“保存”按钮时被调用):
<script type="text/javascript>
$('#btnSave').click(function (event) {
onBegin();
$.ajax(
{
type: "POST",
url: "/Person/Save",
data: $('form').serialize(),
success: function (result) {
if(result.Error) {
$('#dvDetails').html($(result).View));
}
else {
$('#dvPersonList').html($result);
}
}
});
});
</script>
所以我现在遇到的问题是,当出现验证错误时,我确实看到正确的'div'正在更新,但我丢失了asp.net mvc验证消息。我没有看到任何红色验证错误,好像ASP.NET MVC完全被忽略了。但是,我的ModelState确实有那些错误,只是没有显示在详细信息视图中。我确实在我的详细信息视图中放置了验证摘要和Html.ValidationFor(m =&gt; ...)语句。
有人能告诉我为什么我没有看到验证错误吗?虽然我正在使用JSonResult,但我在使用'dvDetails'时使用了正确的属性,这是一个有效的视图。我在asp.net mvc做了一些我不认为的事情吗?顺便说一句,我正在使用asp.net mvc2 RC和Visual Studio 2010 RC。
谢谢。
答案 0 :(得分:0)
Url与Action名称不匹配...不确定您是否在控制器上调用错误的方法...只是一个想法。 : - )
答案 1 :(得分:0)
ASP.NET MVC代码处理响应以在回发期间显示存储在ModelState中的验证错误。因为您使用的是Ajax Post,所以回发代码不会重建页面并显示验证错误。如果要显示验证错误,则必须自己处理。
我是通过将ModelState错误作为响应中的数组传递来完成的。我处理我的Ajax响应以更新表单中的验证错误占位符元素,并在响应中显示相应的错误消息。
虽然出现警告:ModelState中的键可能会更改其大小写,因此表单中的元素ID字符串与用于键的字符串不完全匹配。 ModelStateDictionary不区分大小写,但DOM ID不是。