1

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

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

所以我的问题是:有没有办法让当前的 MvContrib 主干构建与 MVC2 的内置客户端验证一起工作,现在有点痛苦?如果是这样,怎么做?如果没有,是否有其他推荐的客户端验证(xVal 除外,我们目前正在使用并已被折旧)?是否应该在 MvcContrib 中对其进行修补以使其正常工作?最后的手段是转而使用 ASP.NET MVC 的内置输入构建器,但我们已经在 MvcContrib 上投入了大量资金,因此不愿意。

谢谢!

4

2 回答 2

0

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

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

如果你能理解的话,最好把它贴在这里。

保罗

于 2010-11-06T00:29:25.157 回答
0

我从 Paul 的那篇博客文章中得到了评论,并将其修改为使用所有已知的 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";
    }
}

希望对一些人有所帮助。

于 2010-11-09T18:31:57.093 回答