使用MvcContrib FluentHtml进行ASP.NET MVC客户端验证

时间:2010-11-05 14:42:31

标签: c# asp.net asp.net-mvc-2 mvccontrib client-side-validation

使用MvcContrib的FluentHtml构建器使用内置MVC2代码进行客户端验证的推荐方法是什么?我们正在使用jQuery客户端验证代码,而不是默认的Microsoft AJAX内容,如果这很重要(尽管我认为不应该这样)。

当您在页面上放置验证消息(Html.ValidationMessageFor(x => x.FirstName)时,似乎只能通过jQuery Validate注册客户端验证。 MvcContrib的FluentHtml this.ValidationMessage(x => x.FirstName)仅适用于服务器端的ModelState,如果没有错误则不会写出任何HTML,并且不会在客户端使用jQuery Validate注册给定的属性。< / p>

所以我的问题是:有没有办法让MvContrib的当前主干版本与MVC2的内置客户端验证一起工作,现在有点轻松?如果是这样,怎么样?如果没有,是否有另一个建议的客户端验证(除了xVal,我们目前正在使用并已经折旧)?这应该在MvcContrib中修补,以便它正常工作吗?最后一种方法是转向使用ASP.NET MVC的内置输入构建器,但我们已经在MvcContrib中投入了大量资金而不愿意。

谢谢!

2 个答案:

答案 0 :(得分:0)

我处于完全相同的情况......我在这篇文章中发现了有趣的评论,尽管我无法让它发挥作用。

http://lunaverse.wordpress.com/2008/11/24/mvcfluenthtml-fluent-html-interface-for-ms-mvc/

如果您能够理解将它重新发布在这里会很好。

答案 1 :(得分:0)

我从保罗那篇博客文章中得到了评论,并将其修改为使用所有已知的MVC验证适配器而不仅仅是必需的(基本上模仿了框架本身的大部分内容)。它如何显示错误信息并使用我们已有的东西,并且我为MVC Contrib实现了一个补丁来实现它,但最终我现在放弃了,直到MVC3最终化和MVC Contrib构建它。如果有即将发布的更新版本,请务必仔细阅读所有这些内容。

以下是我最终的结果(FluentViewPage<T>是我们添加行为的地方):

public class ClientsideValidationBehavior<T> : IBehavior<IMemberElement> where T : class
{
    private readonly FluentViewPage<T> _viewPage;

    public ClientsideValidationBehavior(FluentViewPage<T> viewPage)
    {
        _viewPage = viewPage;
    }

    public void Execute(IMemberElement element)
    {
        var attribute = element.GetAttribute<ValidationAttribute>();

        if (attribute == null)
        {
            return;
        }

        var formContext = _viewPage.ViewContext.FormContext;
        var fieldMetadata = formContext.GetValidationMetadataForField(UiNameHelper.BuildNameFrom(element.ForMember), true);

        var modelMetadata = ModelMetadata.FromStringExpression(element.ForMember.Member.Name, _viewPage.ViewData);
        var validators = ModelValidatorProviders.Providers.GetValidators(modelMetadata, _viewPage.ViewContext);

        validators.SelectMany(v => v.GetClientValidationRules()).ForEach(fieldMetadata.ValidationRules.Add);

        fieldMetadata.ValidationMessageId = element.ForMember.Member.Name + "_Label";
    }
}

希望有所帮助。