1

MvcContrib の FluentHtml ビルダーで組み込みの MVC2 コードを使用してクライアント側の検証を行うための推奨される方法は何ですか? 問題がある場合は、デフォルトのMicrosoft AJAXのものではなく、jQueryのクライアント側検証コードを使用しています(そうすべきではないと思いますが)。

Html.ValidationMessageFor(x => x.FirstNameページに検証メッセージ ( ))を配置すると、クライアント側の検証のみが jQuery Validate に登録されるようです。MvcContrib の FluentHtmlはサーバー側でthis.ValidationMessage(x => x.FirstName)のみ動作しModelState、エラーがなければ HTML を書き出さず、指定されたプロパティをクライアント側の jQuery Validate に登録しません。

私の質問: MvContrib の現在のトランク ビルドを MVC2 の組み込みのクライアント側検証で動作させる方法はありますか? もしそうなら、どのように?そうでない場合、推奨される別のクライアント側の検証はありますか (現在使用していて減価償却されている xVal 以外に)? これが正しく動作するように、MvcContrib でパッチを適用する必要がありますか? 最後の手段は、ASP.NET MVC の組み込み入力ビルダーの使用に移行することですが、MvcContrib には既に多くの投資を行っているため、使用しない方がよいでしょう。

ありがとう!

4

2 に答える 2

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 に答える
0

私はまったく同じ状況にあります...私はこの投稿に出くわし、興味深いコメントがさらに下にありましたが、うまく機能させることができませんでした。

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

少しでも理解できる場合は、ここに投稿してください。

ポール

于 2010-11-06T00:29:25.157 に答える