私はasp.netでmvcアプリケーションを作成しています。モデルに自分のコントローラを投稿したときに検証メッセージを受け取るために、このメンバでdataAttributeが必要なviewModelを作成しました。これはうまくいきます。オーバーライドmvcの必要なデータ属性
これで、errorMessageの変換を指定するために、Validateメソッドをオーバーライドしたいと考えています。私はキーの翻訳を得るためにカスタムフレームワークを使って作業しています。
表現可能な注釈を使用するには、必須のdataAttributeをオーバーライドする必要があります。ここで
私はその後、私にErrorMessageに
をtranslationKeyを置くコード
のViewModel
public class SocietyInformationViewModel
{
[Required(ErrorMessage = "5614")]
public string Name { get; set; }
}
ですが、私はカスタムModelValidatorとカスタムModelValidatorProvider
ModelValidatorを作成しました
public class LocalizableDataAnnotationsModelValidator : ModelValidator
{
private ModelValidator _innerValidator;
private ModelMetadata _metadata;
public LocalizableDataAnnotationsModelValidator(ModelValidator innerValidator, ModelMetadata metadata, ControllerContext controllerContext)
: base(metadata, controllerContext)
{
_innerValidator = innerValidator;
_metadata = metadata;
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
Service.TranslationService LocalizationManager = new Service.TranslationService();
// execute the inner validation which doesn't have localization
var results = _innerValidator.Validate(container);
// convert the error message (which should be the localization resource key) to the localized value through the ILocalizationResourceProvider
return results.Select((result) =>
{
string message = result.Message;
int key = 0;
if (Int32.TryParse(result.Message, out key))
message = LocalizationManager.Get(key, "");
return new ModelValidationResult() { Message = string.Format(message, _metadata.DisplayName) };
});
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
Service.TranslationService LocalizationManager = new Service.TranslationService();
var somerules = _innerValidator.GetClientValidationRules().ToList();
foreach (var rule in somerules)
{
int key = 0;
if (rule.ErrorMessage != null && rule.ErrorMessage.Length >= 3 && rule.ErrorMessage.Length <= 5 && Int32.TryParse(rule.ErrorMessage, out key))
rule.ErrorMessage = LocalizationManager.Get(key, "");
}
return somerules;
}
}
ModelValidatorProvider
public class LocalizableDataAnnotationsModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
public LocalizableDataAnnotationsModelValidatorProvider()
: base()
{
}
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
var validators = base.GetValidators(metadata, context, attributes);
var cnt = validators.Count();
var result = new List<LocalizableDataAnnotationsModelValidator>();
foreach (var validator in validators)
{
result.Add(new LocalizableDataAnnotationsModelValidator(validator, metadata, context));
}
return result;
}
}
そして今、私はこのように行う場合は、実行時に、私は次の例外
を持ってapplicationStartprivate void RegisterModelProviders() { // register the model metadata provider //ModelMetadataProviders.Current = new LocalizableDataAnnotationsModelMetadataProvider(); //// register the model validation provider var provider = ModelValidatorProviders.Providers.Where(p => p.GetType() == typeof(DataAnnotationsModelValidatorProvider)).FirstOrDefault(); DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; if (provider != null) { ModelValidatorProviders.Providers.Remove(provider); } //ModelValidatorProviders.Providers.Clear(); provider = new LocalizableDataAnnotationsModelValidatorProvider(); ModelValidatorProviders.Providers.Add(provider); }
上のglobal.asaxでRegisterModelProvidersを呼び出します
控えめなクライアント検証ルールの検証タイプ名は一意でなければなりません。次の検証タイプは複数回見ました:必要な
だから私は、ウェブ上で検索し、私は私のweb.configファイルを変更してきたと虚偽のClientValidationEnabledキーに設定することを言うコメントこのarticleを見つけました。私はそれをやった、と
は私が失わ少しだ...エラーは消えていませんでしたが、私のmodelValidorはもう呼ばれ、任意のヘルプは=========更新歓迎です====
Ninjectを使用すると、NinjectDataAnnotationsModelValidatorProviderが追加されることがわかりました。私はメッセージ
を持っているだからこそ、次の検証タイプは複数回見ました:必要な
だから私はNinjectDataAnnotationsModelValidatorProviderを削除しようとするが、私はそれのために任意の解決策を見つけることができません。
======アップデート2 =======
前の問題を解決するために、私はgithubの上Ninject.Web.Mvcプロジェクトをダウンロードして、私の解決策に含めます。次に、この行を削除します(MvcModuleから削除します)。CS)
this.Kernel.Bind<ModelValidatorProvider>().To<NinjectDataAnnotationsModelValidatorProvider>();
私はそれが最善の解決策ではないと知っているが、それは私が複数のプロバイダが同じバリデータを提供する場合
理由だけではなく、リソースファイルを使用していませんか? –
私が言うように、私は翻訳を得るためにカスタムフレームワークを使用します。 – dpfauwadel