2010-03-29 47 views
0

我一直在使用asp.net mvc(但我仍然是一个开始)。我想有能力更新两个视图作为jquery回发的结果。ASP.NET MVC 2 JQuery POST不显示模型状态错误

基本上我有一个列表和详细信息视图。详细信息视图是使用jquery弹出窗口(使用jQuery UI弹出窗口)呈现的。如果细节保存成功(即细节视图中没有验证错误),我只想更新列表。但是,如果细节视图中有任何验证错误,我想更新详细信息视图,以便用户看到验证错误。

所以我想在我的控制器中,我返回一个JsonResult而不是一个View。你可以看到如果没有错误,我返回人员列表视图,但是如果有任何验证错误,我已经返回细节视图。我返回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 => ...)语句放在我的详细信息视图中。

有人能告诉我为什么我没有看到验证错误吗?尽管我使用的是JSonResult,但我在使用'dvDetails'时使用了正确的属性,这是一个有效的视图。我在做asp.net mvc中没有的东西吗?顺便说一句我用Visual Studio 2010 RC使用asp.net mvc2 RC。

谢谢。

回答

0

Url与Action名称不匹配......不确定您是否正在调用控制器上的错误Method ...只是一个想法。 :-)

+0

谢谢您的回复。对不起,这是我的问题中的拼写错误。我已绝对确信网址是正确的。事实上,我已经调试过,它会打电话给我的控制器。事实上,当验证失败时,ModelState将包含验证错误(由于我的数据注释)。真的不知道为什么我没有看到在视图中的错误:(。 – Oshan 2010-04-01 07:39:14

+0

好吧,只是想确保... 也许它的一个限制,当它作为一个部分视图被拒绝 你看过这个:http://stackoverflow.com/questions/1556533/asp-net-mvc-modelstate-and-partial-view似乎是相同的probmen。 – Syska 2010-04-01 15:48:01

0

ASP.NET MVC代码处理响应以在回发期间显示存储在ModelState中的验证错误。因为您使用的是Ajax Post,所以回发代码不会重建页面并显示验证错误。如果你想显示验证错误,你必须自己处理。

我已经通过在响应中传递ModelState错误作为数组来完成它。我处理我的Ajax响应,以更新响应中相应错误消息的表单中的验证错误占位符元素。

但是,一个警告:ModelState中的键可能会更改其大小写,因此表单中的元素ID字符串与用于该键的字符串不完全匹配。 ModelStateDictionary不区分大小写,但DOM ID不是。