MVCで実行時に表示属性と必須属性をカスタマイズする方法

ポール・マーズデン

実行時に設定されるが、文字列フォーマットを使用するリソースファイルからの文字列に基づく、かみそりビューの動的ラベルを持つモデルが必要です。

単一のプロパティを持つ単純なモデルがあるとしましょう

public class Simple
{
    [Display(ResourceType = (typeof(Global)), Name = "UI_Property1")]
    [Required(ErrorMessageResourceType = (typeof(Global)), ErrorMessageResourceName = "ERROR_Required")]
    [StringLength(40, ErrorMessageResourceType = (typeof(Global)), ErrorMessageResourceName = "ERROR_MaxLength")]
    public string Property1{ get; set; }
}

そして、リソースファイルには次の文字列があります

UI_Property1       {0}
ERROR_Required     Field {0} is required.
ERROR_MaxLength    Maximum length of {0} is {1}

かみそりのビューでこのようなことをしたいです

@Html.LabelFor(m => m.Property1, "xyz", new { @class = "control-label col-sm-4" })

結果のビューには、フィールドラベルが「xyz」として表示され、値「xyz」もサーバーモデルの検証から返される検証メッセージに表示されます。

私はこれを運がなくて行うさまざまな方法を検討してきました。DisplayAttributeのオーバーライドを調査しましたが、これは封印されたクラスです。

DisplayName属性のオーバーライドも確認しましたが、これは必要な検証メッセージで正しく取得されません。さらに、属性コンストラクターで実行する必要があると思われる属性に動的テキストを挿入する方法がわかりませんでした。

カスタムDataAnnotationsModelMetadataProviderの作成も検討しましたが、これを使用して目的を達成する方法がわかりません。これは私のコーディングスキルの欠如によるものかもしれません。

'xyz'文字列は、web.configファイルの設定から取得され、LabelForコマンドで挿入する必要はありませんが、より意味がある場合は別の場所に挿入できます。

誰かが私がこれをどのように達成することができるかについて私に手がかりを与えることができればそれは素晴らしいことです。

ポール・マーズデン

この投稿を見つけました

DataAnnotationsModelMetadataProviderを置き換えて、返されたModelMetadataを操作することは有効ですか?

それは私を次のような解決策に導きました:

Web設定にカスタムセクションを追加しました

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="labelTranslations" type="AttributeTesting.Config.LabelTranslatorSection" />
    ... other sections here
  </configSections>

  <labelTranslations>
    <labels>
      <add label=":Customer:" translateTo="Customer Name" />
      <add label=":Portfolio:" translateTo="Portfolio Name" />
      <add label=":Site:" translateTo="Site Name" />
    </labels>
  </labelTranslations>

カスタムセクションを処理するためのクラスは、翻訳されるラベルをロードします

public class LabelElement : ConfigurationElement
{
    private const string LABEL = "label";
    private const string TRANSLATE_TO = "translateTo";

    [ConfigurationProperty(LABEL, IsKey = true, IsRequired = true)]
    public string Label
    {
        get { return (string)this[LABEL]; }
        set { this[LABEL] = value; }
    }

    [ConfigurationProperty(TRANSLATE_TO, IsRequired = true)]
    public string TranslateTo
    {
        get { return (string)this[TRANSLATE_TO]; }
        set { this[TRANSLATE_TO] = value; }
    }

}

[ConfigurationCollection(typeof(LabelElement))]
public class LabelElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new LabelElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((LabelElement)element).Label;
    }

    public LabelElement this[string key]
    {
        get
        {
            return this.OfType<LabelElement>().FirstOrDefault(item => item.Label == key);
        }
    }
}

public class LabelTranslatorSection : ConfigurationSection
{
    private const string LABELS = "labels";

    [ConfigurationProperty(LABELS, IsDefaultCollection = true)]
    public LabelElementCollection Labels
    {
        get { return (LabelElementCollection)this[LABELS]; }
        set { this[LABELS] = value; }
    }
}

次に、翻訳者はカスタムセクションを使用して、特定のラベルが存在する場合は翻訳済みバージョンに翻訳し、存在しない場合はラベルを返します。

public static class Translator
{
    private readonly static LabelTranslatorSection config =
        ConfigurationManager.GetSection("labelTranslations") as LabelTranslatorSection;

    public static string Translate(string label)
    {
        return config.Labels[label] != null ? config.Labels[label].TranslateTo : label;
    }
}

次に、翻訳されたバージョンに基づいて表示名を変更するカスタムメタデータプロバイダーを作成しました

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
                             IEnumerable<Attribute> attributes,
                             Type containerType,
                             Func<object> modelAccessor,
                             Type modelType,
                             string propertyName)
    {

        // Call the base method and obtain a metadata object.
        var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        if (containerType != null)
        {
            // Obtain informations to query the translator.
            //var objectName = containerType.FullName;
            var displayName = metadata.GetDisplayName();

            // Update the metadata from the translator
            metadata.DisplayName = Translator.Translate(displayName);
        }

        return metadata;
    }
}

その後、すべてが正常に機能し、ラベルと検証メッセージはすべて翻訳されたバージョンを使用しました。標準のLabelForヘルパーを変更せずに使用しました。

リソースファイルは次のようになります

ERROR_MaxLength   {0} can be no more than {1} characters long   
ERROR_Required    {0} is a required field   
UI_CustomerName   :Customer:    
UI_PortfolioName  :Portfolio:   
UI_SiteName       :Site:    

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

送信時にHTMLの「必須」属性をバイパスする

分類Dev

実行時にantdテーマをカスタマイズする方法は?

分類Dev

YiiブースターradioButtonListRowで「必須」属性を使用する方法

分類Dev

iOSで実行時にサブクラスの実装をカスタマイズする方法は?

分類Dev

モデルでは必須になっていますが、MVC4で必須属性を削除する方法

分類Dev

実行時にFilterProviderをカスタマイズすることは可能ですか?

分類Dev

simple_formの必須ラベルをカスタマイズする

分類Dev

WordPressサイトで属性をカスタマイズする

分類Dev

実行時にXMLで定義されたカスタムドローアブルをカスタマイズする方法は?

分類Dev

FluentValidation-実行時に検証メッセージをカスタマイズする方法

分類Dev

Spring Bootで実行時にカスタマイズされたクエリを作成することは可能ですか?

分類Dev

必須属性を宣言するjsfカスタムコンポーネント

分類Dev

プラグインの非アクティブ化時にカスタム投稿または分類法を削除することは必須ですか?

分類Dev

ASP MVCで要素の必須属性を動的に削除しますか?

分類Dev

MVC Razor ViewでTextAreaをカスタマイズする方法は?

分類Dev

実行時にカスタム属性をリロードするにはどうすればよいですか?ASP.NET Core MVC

分類Dev

テンプレートをカスタマイズした後、デフォルトの必須メッセージを表示する

分類Dev

カスタマイズした時間をHIVEで秒に変換する方法

分類Dev

is_ajax_request 関数の実行中に CODEIGNITER で 404 ページをカスタマイズする方法

分類Dev

HTTPリクエストで必須属性を不要にすることはできますか?

分類Dev

select2でajaxを使用すると、カスタマイズされた属性値を取得できません

分類Dev

スキャナーとタイマーを同時に実行する方法

分類Dev

Rails:空の「必須」属性をradio_button_tagに追加する方法

分類Dev

JavaScriptでHTML5必須属性を設定する方法は?

分類Dev

PHPでHTMLラジオボタンのカスタマイズされた属性値を取得する方法

分類Dev

VeeValidate(Vue.Js)の辞書を使用して、ValidationProviderの「必須」エラーメッセージをカスタマイズする方法

分類Dev

Spring JSP:TLDまたはタグファイルによると、タグ入力には属性パスが必須です

分類Dev

「必須」のhtml属性を持つカスタムエラーメッセージをmvc5 razorviewテキスト入力エディターに追加する方法

分類Dev

PHPでSolrを実行するには、PECLとsolariumが必須ですか?

Related 関連記事

  1. 1

    送信時にHTMLの「必須」属性をバイパスする

  2. 2

    実行時にantdテーマをカスタマイズする方法は?

  3. 3

    YiiブースターradioButtonListRowで「必須」属性を使用する方法

  4. 4

    iOSで実行時にサブクラスの実装をカスタマイズする方法は?

  5. 5

    モデルでは必須になっていますが、MVC4で必須属性を削除する方法

  6. 6

    実行時にFilterProviderをカスタマイズすることは可能ですか?

  7. 7

    simple_formの必須ラベルをカスタマイズする

  8. 8

    WordPressサイトで属性をカスタマイズする

  9. 9

    実行時にXMLで定義されたカスタムドローアブルをカスタマイズする方法は?

  10. 10

    FluentValidation-実行時に検証メッセージをカスタマイズする方法

  11. 11

    Spring Bootで実行時にカスタマイズされたクエリを作成することは可能ですか?

  12. 12

    必須属性を宣言するjsfカスタムコンポーネント

  13. 13

    プラグインの非アクティブ化時にカスタム投稿または分類法を削除することは必須ですか?

  14. 14

    ASP MVCで要素の必須属性を動的に削除しますか?

  15. 15

    MVC Razor ViewでTextAreaをカスタマイズする方法は?

  16. 16

    実行時にカスタム属性をリロードするにはどうすればよいですか?ASP.NET Core MVC

  17. 17

    テンプレートをカスタマイズした後、デフォルトの必須メッセージを表示する

  18. 18

    カスタマイズした時間をHIVEで秒に変換する方法

  19. 19

    is_ajax_request 関数の実行中に CODEIGNITER で 404 ページをカスタマイズする方法

  20. 20

    HTTPリクエストで必須属性を不要にすることはできますか?

  21. 21

    select2でajaxを使用すると、カスタマイズされた属性値を取得できません

  22. 22

    スキャナーとタイマーを同時に実行する方法

  23. 23

    Rails:空の「必須」属性をradio_button_tagに追加する方法

  24. 24

    JavaScriptでHTML5必須属性を設定する方法は?

  25. 25

    PHPでHTMLラジオボタンのカスタマイズされた属性値を取得する方法

  26. 26

    VeeValidate(Vue.Js)の辞書を使用して、ValidationProviderの「必須」エラーメッセージをカスタマイズする方法

  27. 27

    Spring JSP:TLDまたはタグファイルによると、タグ入力には属性パスが必須です

  28. 28

    「必須」のhtml属性を持つカスタムエラーメッセージをmvc5 razorviewテキスト入力エディターに追加する方法

  29. 29

    PHPでSolrを実行するには、PECLとsolariumが必須ですか?

ホットタグ

アーカイブ