ASP.NET MVC PartialView回发:如何验证数据?

时间:2010-09-07 23:26:12

标签: asp.net-mvc jquery validation asp.net-mvc-partialview

我正在使用像本例中的ASP.NET部分视图

<% using (Html.BeginForm()) { %>
    <table cellspacing="2" cellpadding="0" border="0" width="100%">
    <tr>
        <td><%= Html.LabelFor(model => model.PersonName)%></td>
        <td>
            <%= Html.TextBoxFor(model => model.PersonName)%>
            <%= Html.ValidationMessageFor(model => model.PersonName, "*")%>
        </td>
    </tr>
    ...
    <tr><td colspan="2"><%= Html.ValidationSummary(false) %></td></tr>
    </table>
<% } %>

我在Jquery对话框中显示这些部分视图,使用jquery代码

调用它们
$.ajax({
    type: "get",
    dataType: "html",
    url: urlAction,
    data: {},
    success: function(response) {
        $("#panelDetail").html('').html(response).dialog('open');
    }
});

一切正常,让我开心。我也可以使用jquery ajax提交表单,这让我更开心。 :)

真正令人烦恼的是,我不明白验证发生的位置,因为当它发生时,它会完全刷新页面并关闭对话框。

我相信有人可以提供帮助。无论如何....谁会是谁? :)

提前致谢!

修改

这是控制器动作签名,其中包含一些代码

[HttpPost]
public ActionResult MyAction(FormCollection form) {
    string foroID = form["ForoId"];
    string foro = form["Foro"];
    string authorityId = form["AuthorityId"];
    string sezione = form["Sezione"];
    ...
}

我是否必须重新创建模型类才能对其进行验证?

2 个答案:

答案 0 :(得分:3)

首先:如果您正在使用客户端验证,那么使用JavaScript的第一次检查已经在客户端,但您的验证会在输入数据时显示错误。

其次:只要您的操作采用与您的PartialView具有相同类型的参数,就会在该特定点验证发送回控制器操作的数据型号。如果此类型(类)具有附加到属性的数据注释,则会验证这些注释。当然,您还应该检查行动中的模型错误并采取相应的行动。

重定向?如果您提供更多控制器操作代码,我们可以更轻松地检查发生了什么,并提供一些额外的帮助。

我是如何处理这种情况的

我创建了一个特殊的操作过滤器,用于检查模型状态错误,并向客户端返回400错误描述。我的所有Ajax调用都会处理success以及error个回复并采取相应的行动。

检查代码here (question and solution)

实际解决方案

  

此解决方案基于以下评论中提供的其他信息

所以经过讨论后,问题实际上并不是整页回发,而是完全没有发生的验证。原因是控制器操作采用类型FormCollection的参数。 MVC框架不知道如何验证数据,因此不会进行验证。

您需要做的更改是更改此参数的类型,以匹配您的强类型视图。如果您的视图属于ViewPage<MyCustomType>类型,那么您的HttpPost操作应该最有可能具有相同类型的参数。

通常,操作类型可以包含任何类型的参数。是的,它可以有更多的参数。唯一的限制是默认模型绑定器将能够将发布的数据与这些参数相关联。这就是你进来的地方。你所要做的就是正确命名你的参数,模型活页夹将完成剩下的工作。

如果您遇到某种情况,这种情况无法轻易完成,您可以随时为特定类型编写自定义模型绑定器,并且您将完全了解如何解析发布的数据。

答案 1 :(得分:1)

罗伯特在here

中提出的建议

在关闭对话框之前,在关闭对话框之前通过ajax提交表单时,尝试检查服务器响应是什么,在调用{{1}之前尝试检查响应是否有效或模型状态是否无效对话框。在对话框的所有其他情况下也是如此。