大家下午好.我想知道是否有MVC框架自动连接控件上的data-val*属性,还是我们需要手动创建属性并将其应用于动态内容?
我有一个视图,最初调用在主视图模型中传递的局部视图.此部分视图绑定到我的主视图模型上的复杂属性.局部视图只包含一组级联下拉列表.在我打电话给页面的初始加载时,@Html.Partial("PartialName", Model)如果我尝试提交而没有选择适当的值,则两个下拉列表的验证工作正常.我还在页面上有另一个按钮,如果单击该按钮,则会在页面上加载另一个局部视图实例.如果我现在尝试提交表单这些控件,虽然它们绑定到相同的模型,虽然我已经设置了正确的.ValidationMessageFor帮助程序,但是没有为它们显示验证,因为下拉列表似乎不是使用data-val*属性生成的.有什么方法可以让它们正确显示吗?我还注意到,也没有生成<span />与之关联的关联标记.ValidationMessageFor.有没有人遇到这个问题,如果是这样,你是如何解决的?
这是我调用的javascript函数在按钮的onClick事件上加载部分:
function AddNewVehicle() {
$.ajax({
type: 'GET',
url: '/ReservationWizard/AddVehicleToReservation',
data: $('#reservation-wizard-form').serialize(),
dataType: 'HTML',
async: true,
success: function (data) {
if (data != null) {
$('#vehicle-selection-container').append(data);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果您不在表单上下文中,则HTML帮助程序(如TextBoxFor)不会输出任何客户端验证数据 - *属性.页面加载时第一次调用你的Html.RenderPartial内部,Html.BeginForm()但是当你使用AJAX附加表单元素时,不再有这种表单上下文,也不会data-*生成任何客户端验证属性.一种可能的解决方案是将表单放在partial中,然后在AJAX调用期间更新整个表单,并在成功回调中使用重新解析客户端验证规则$.validator.unobtrusive.parse('#vehicle-selection-container').
但是如果你想在部分内部只保留一个元素,那么你几乎可以自己:-)这是一篇博文,其中涵盖了你可能会看到的场景.
那么我能说什么:不引人注目的客户端验证在纸上和Scott Gu的博客文章中都很棒,但在现实世界应用程序开发的某个阶段,人们开始意识到它的局限性.这就是为什么我直接使用jquery.validate插件而没有MS jquery.unobtrusive 的原因之一.并且,是的,我知道我在javascript中重复我的服务器验证逻辑,是的,我不在乎,因为我有完全控制权.哦,在服务器上我使用FluentValidation.NET而不是数据注释,其原因与客户端部分相同:-)
所以也许有一天在MVC 4中微软最终会使验证成为正确(命令性与声明性),但直到今天,我们才需要寻找解决方法.
| 归档时间: |
|
| 查看次数: |
4480 次 |
| 最近记录: |