关于jquery:ASP.NET MVC Partial View回发:如何验证数据?

ASP.NET MVC PartialView postback: how to validate data?

我使用的是ASP.NET局部视图,如本例中所示

1
2
3
4
5
6
7
8
9
10
11
12
13
<% 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代码调用它们

1
2
3
4
5
6
7
8
9
$.ajax({
    type:"get",
    dataType:"html",
    url: urlAction,
    data: {},
    success: function(response) {
        $("#panelDetail").html('').html(response).dialog('open');
    }
});

一切都很好,让我快乐。我还可以使用jquery ajax提交表单,这让我更高兴。:)

真正令人恼火的是,我不知道验证发生在哪里,因为当验证发生时,它会对页面进行完全刷新并关闭对话框。

我相信有人能帮上忙。不管怎样……谁会?:)

事先谢谢!

编辑:

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

1
2
3
4
5
6
7
8
[HttpPost]
public ActionResult MyAction(FormCollection form) {
    string foroID = form["ForoId"];
    string foro = form["Foro"];
    string authorityId = form["AuthorityId"];
    string sezione = form["Sezione"];
    ...
}

我需要重新创建模型类来验证它吗?


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

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

重定向?如果您提供更多的控制器操作代码,我们可以更容易地检查正在发生的事情并提供一些额外的帮助。

我是怎么处理这种情况的

我创建了一个特殊的操作过滤器,用于检查模型状态错误,并向客户端返回400个错误描述。我所有的Ajax调用都处理successerror的响应并相应地执行。

检查这里的代码(问题和解决方案)。

实际解决方案

This solution is based on additional information gotten from comments below

所以在讨论之后,问题其实不是整页的发帖,而是根本没有进行的验证。原因是控制器动作采用FormCollection型参数。MVC框架不知道如何验证数据,因此不会进行验证。

您需要做的更改是更改此参数的类型,以匹配强类型视图。如果您的视图是ViewPage类型,那么您的HttpPost操作很可能具有相同类型的参数。

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

如果遇到一种不容易完成的情况,您总是可以为特定类型编写一个自定义模型绑定器,这完全取决于您如何解析发布的数据。


这里有罗伯特的建议

在关闭对话框之前,在关闭对话框之前通过Ajax提交表单时,请尝试检查服务器响应是什么,在调用对话框的dialog('close')之前,请尝试检查响应是有效的还是无效的模型状态。在对话的所有其他情况下都是一样的。