質問

nhibernate.validatorをASP.NET MVCクライアントサイドの検証と統合しようとしていますが、私が見つけた唯一の問題は、非透過的なメッセージを人間の読み取り可能なメッセージに変換できないことです。これは簡単な作業だと思いましたが、クライアント側の検証の中で最も難しい部分であることが判明しました。主な問題は、それがサーバー側ではないため、実際に使用されている検証属性のみが必要であり、実際にはインスタンスや他のものがないことです。

ここに私がすでに試してきたことからの抜粋があります:

// Get the the default Message Interpolator from the Engine
IMessageInterpolator interp = _engine.Interpolator;
if (interp == null)
{
  // It is null?? Oh, try to create a new one
  interp = new NHibernate.Validator.Interpolator.DefaultMessageInterpolator();
}

// We need an instance of the object that needs to be validated, se we have to create one
object instance = Activator.CreateInstance(Metadata.ContainerType);

// we enumerate all attributes of the property. For example we have found a PatternAttribute
var a = attr as PatternAttribute;

// it seems that the default message interpolator doesn't work, unless initialized
if (interp is NHibernate.Validator.Interpolator.DefaultMessageInterpolator)
{
  (interp as NHibernate.Validator.Interpolator.DefaultMessageInterpolator).Initialize(a);
}

// but even after it is initialized the following will throw a NullReferenceException, although all of the parameters are specified, and they are not null (except for the properties of the instance, which are all null, but this can't be changed)
var message = interp.Interpolate(new InterpolationInfo(Metadata.ContainerType, instance, PropertyName, a, interp, a.Message));

上記は、一見単純な質問のためのかなり複雑なコードであることを知っていますが、私はまだ解決策なしで立ち往生しています。 nhvalidatorから補間文字列を取り出す方法はありますか?

役に立ちましたか?

解決

わかりました、だから私はこれが古い質問であることを知っていますが、私は同じことをしようとするとき、私はこれにつまずきました、そしてそれは私が始めるのを助けました - 私は答えを提供すると思いました。

質問のコードは正しい軌道に乗っていたと思いますが、いくつかの問題があります。インタープロレーターは完全に初期化されていません ResourceManagerCulture 詳細、そしてそれはあなたが1つしか持っていないという事実を許していないようです DefaultMessageInterpolator 検証属性ごと。また、補間メッセージを取得するために検証しているオブジェクトのインスタンスは必要ありません。

質問のコードでは、属性値を使用してインタープロレーターを初期化している場合は、interpolatorを初期化する必要があります。 ResourceManager 使用する。

これは、オーバーロードされたものを使用して実行できます Initialize メソッドオン DefaultMessageInterpolator 次の署名があります。

    public void Initialize(ResourceManager messageBundle, 
                           ResourceManager defaultMessageBundle, 
                           CultureInfo culture)

最初のパラメーターはユーザー定義のResourceManagerです。独自のリソースファイルをエラーメッセージに使用する場合は、デフォルトのresouceManagerを使用する場合にnullを渡すことができます。

  new ResourceManager( 
      NHibernate.Validator.Cfg.Environment.BaseNameOfMessageResource,
      Assembly.GetExecutingAssembly());

このため、最後のパラメーターは使用する文化です(nhibernate.validatorにはいくつかの言語で検証メッセージが付いたリソースファイルが付属しています) - これにnullを渡すと、それはただ使用します CultureInfo.CurrentCulture

最後に、1つしか持っていません DefaultMessageInterpolator 属性ごとに、新しいものを作成する必要があります DefaultMessageInterpolator 各検証属性について。あなたはを利用することができます DefaultMessageInterpolatorAggregator これを処理するか、自分で転がすだけです。

これが誰かを助けることを願っています。

他のヒント

あなたの助けをありがとう - 私ができれば私はアップ投票しました。 Stankが説明するDefaultMessageInterPolatorの最初の初期化コールに加えて、2番目の異なる初期化呼び出しを完全に初期化する必要がありました(最初の呼び出しのみを使用してNULL参照例外を取得していました)。私のコードは次のとおりです。

string interpolatedMessage = "";
DefaultMessageInterpolator interpolator = new DefaultMessageInterpolator();

interpolator.Initialize(null,
    new ResourceManager(
        NHibernate.Validator.Cfg.Environment.BaseNameOfMessageResource,
        Assembly.Load("NHibernate.Validator")),
        CultureInfo.CurrentCulture);

interpolator.Initialize(attribute as Attribute);

if (attribute is IValidator && attribute is IRuleArgs)
{
    IValidator validator = attribute as IValidator;
    IRuleArgs ruleArgs = attribute as IRuleArgs;

    InterpolationInfo interpolationInfo = new InterpolationInfo(
        validatableType, 
        null, 
        propertyName, 
        validator,
        interpolator, 
        ruleArgs.Message);

    interpolatedMessage = interpolator.Interpolate(interpolationInfo);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top