ASP.NET MVC 3动态控件和不显眼的验证

mre*_*ros 2 asp.net-mvc-3

大家下午好.我想知道是否有MVC框架自动连接控件上的data-val*属性,还是我们需要手动创建属性并将其应用于动态内容?

我有一个视图,最初调用在主视图模型中传递的局部视图.此部分视图绑定到我的主视图模型上的复杂属性.局部视图只包含一组级联下拉列表.在我打电话给页面的初始加载时,@Html.Partial("PartialName", Model)如果我尝试提交而没有选择适当的值,则两个下拉列表的验证工作正常.我还在页面上有另一个按钮,如果单击该按钮,则会在页面上加载另一个局部视图实例.如果我现在尝试提交表单这些控件,虽然它们绑定到相同的模型,虽然我已经设置了正确的.ValidationMessageFor帮助程序,但是没有为它们显示验证,因为下拉列表似乎不是使用data-val*属性生成的.有什么方法可以让它们正确显示吗?我还注意到,也没有生成<span />与之关联的关联标记.ValidationMessageFor.有没有人遇到这个问题,如果是这样,你是如何解决的?

UPDATE

这是我调用的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)

Dar*_*rov 7

问题是,如果您不在表单上下文中,则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中微软最终会使验证成为正确(命令性与声明性),但直到今天,我们才需要寻找解决方法.