2016-05-12 1 views
0

C#4.5でMVC 4.0を使用しています。異なるプロパティタイプを使用して、それらをHtmlExensionメソッドに渡すにはどうすればよいですか?

私は、主に静的テキストを含むビューを持っていますが、モデルのデータもいくつかあります。時々私はちょうど{0のような単一の余分な値を必要とする、私はちょうど

  • この文字列を取るよう

    • 時々私は余分な値を必要としない:私はの.resxファイル内のテキストを維持する必要がありますし、いくつかの例は次のように見えるかもしれません}この
    • エントリ{0}このような値は{1}

    を私はの.resxファイルから値をロードする属性を持つているので時々私はリストを必要とします。これらはViewModelを飾る。上記の3つの例は次のようになります。

    // 1 -EgOne would = string.empty 
        [Label("RESX_EXAMPLE_1")] 
        [StringTemplate("RESX_EXAMPLE_1_VALUE")] 
        [ReadOnly(true)] 
        public string EgOne { get; set; } 
    
        // 2 -EgTwo would = "davy" 
        [Label("RESX_EXAMPLE_2")] 
        [StringTemplate("RESX_EXAMPLE_2_VALUE")] 
        [ReadOnly(true)] 
        public string EgTwo { get; set; } 
    
        // 3 - EgThree would bethe list 
        [Label("RESX_EXAMPLE_3")] 
        [StringTemplate("RESX_EXAMPLE_3_VALUE")] 
        [ReadOnly(true)] 
        public IList<string> EgThree 
        { 
         get 
         { 
          this.instalmentValues.Add("foo"); 
          this.instalmentValues.Add("bar"); 
    
          return this.instalmentValues; 
         } 
        } 
    

    を私の見解では使用方法は次のとおりです。

    @Html.DisplayFor(model => model.EgOne, "ResourceLabel") 
    @Html.DisplayFor(model => model.EgTwo, "ResourceLabel") 
    @Html.DisplayFor(model => model.EgThree, "ResourceLabel") 
    

    私は可能な限りこれに近いとして上記を維持したいと思います。

    「ResourceLabel」は現在のところ@Html.StringTemplateFor(model => model)です。

    このように、View Modelで使用できるさまざまなタイプの3つのシナリオを理想的にサポートするHtm Extensionが必要です。あなたは時にはそれがするので、時にはそれが何の価値もありません、私はmetdata.modelの値を取るしようとしていますreturn文から見るとresxファイル属性によって返される文字列にそれらを噴出することができ

    public static IHtmlString StringTemplateFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, 
                        Expression<Func<TModel, 
                        IEnumerable<TProperty>>> expression) 
    {   
         var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
         var attribute = // comes from the aforementioned attribute 
    
         return new HtmlString(attribute.StringTemplate.FormatInvariant(((IEnumerable<TProperty>)metadata.Model).ToArray())); 
    } 
    

    1つがあり、時にはそれがリストになります。

    これがより明確になることを希望します。必要に応じてさらに情報を提供することができます。

  • +0

    ビットのようなものを取得します。 'attribute.StringTemplate.FormatInvariant(...' - あなたが表示したコードは 'attribute'を宣言していません) –

    +0

    @Stephen - 申し訳ありませんが、簡潔にするためにいくつかのコードを削除しようとしました。リストの代わりにそのリストのどこにでもリストを使うことができるかどうかを知る必要があります。 – davy

    +0

    '@StringTemplateFor(m => m.SomeProperty)'のようなものを使いたいのですか? 'SomeProperty'は'List '?もしそうなら、そのデータで何をしたいのか分かりません。 –

    答えて

    0

    あなたはIEnumerable<TProperty>TPropertyを交換する場合は、あなたがここでやって何不明確この

    public static IHtmlString StringTemplateFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, IEnumerable<TProperty>>> expression) 
    { 
        return new HtmlString(
         attribute.FormatInvariant(((IEnumerable<TProperty>)metadata.Model).ToArray())); 
    } 
    
    +0

    ありがとうございます。これを試しましたが、エラーが出ます:HtmlExtensionsの型引数.StringTemplateFor (System.Web.Mvc.HtmlHelper 、System.Linq.Expressions.Expression >>) 'を使用から推測することはできません。型引数を明示的に指定してみてください。 質問を更新します – davy

    +0

    私は質問を更新しました。 – davy

    関連する問題