3

我正在使用本示例中的 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"];
    ...
}

我是否必须重新创建模型类来验证它?

4

2 回答 2

3

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

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

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

我是如何处理这种情况的

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

在此处检查代码(问题和解决方案)

实际解决方案

此解决方案基于从以下评论中获得的其他信息

因此,经过讨论,问题实际上并不是整个页面的回发,而是根本没有发生的验证。原因是控制器操作采用 type 的参数FormCollection。MVC 框架不知道如何验证该数据,因此不会发生验证。

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

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

如果您遇到无法轻松完成的特定情况,您始终可以为特定类型编写自定义模型绑定器,这将完全取决于您如何解析发布的数据。

于 2010-09-08T00:09:41.610 回答
1

罗伯特的建议在这里

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

于 2010-09-08T00:21:25.907 回答