2011-11-18 23 views
4

私は、次のクラスがあります。拡張メソッドでHTMLヘルパーメソッドを使用するにはどうすればよいですか?

Html.HiddenFor(model => model.Note.Created) 

今私は何をしようとしていますが作成することです。私の見解では

public class Note 
{ 
    public string Text { get; set; } 
    public RowInfo RowInfo { get; set; } 
} 

public class RowInfo 
{ 
    [DisplayName("Created")] 
    public DateTime Created { get; set; } 
    [DisplayName("Modified")] 
    public DateTime Modified { get; set; } 
} 

を私が正しい名前と値でHTMLを作成し、以下を持っています上記を含み、それぞれのビューを呼び出すことができる拡張メソッド。私は次のことを試みました。私は正しい軌道に乗っていると思うが、「model => model.Note.Created」と同等のことをする方法がわからない。誰かが私にこれをどうやって行うことができ、括弧内のテキストを置き換える必要があるかについて助言を与えることができる。私はモデルを持っていませんが、私はこれを他の方法でやることができますので、隠されたフィールドは上のように正しいDisplayNameを得るために私のクラスを見ますか?

public static class StatusExtensions 
{ 
    public static IHtmlString StatusBox<TModel, TProperty>(
     this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     return new HtmlString(
      "Some things here ... " + 
      helper.HiddenFor(ex)); 
    } 
} 

、その後:

@Html.StatusBox(model => model.RowInfo.Created) 

UPDATE:

に要求されるようにあなたがλ式を取って強く型付けされたヘルパーを書くことができ

namespace ST.WebUx.Helpers.Html 
    { 
    using System.Web.Mvc; 
    using System.Web.Mvc.Html 
    using System.Linq; 

public static class StatusExtensions 
{ 
    public static MvcHtmlString StatusBox(this HtmlHelper helper, RowInfo RowInfo) 
    { 
     return new MvcHtmlString( 
      "Some things here ... " + 
      System.Web.Mvc.Html.InputExtensions.Hidden(for created field) + 
      System.Web.Mvc.Html.InputExtensions.Hidden(for modified field)); 
    } 

} 

答えて

4

コメント欄には以下の改訂版がありますヘルパー:

public static class StatusExtensions 
{ 
    public static IHtmlString StatusBox<TModel>(
     this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, RowInfo>> ex 
    ) 
    { 
     var createdEx = 
      Expression.Lambda<Func<TModel, DateTime>>(
       Expression.Property(ex.Body, "Created"), 
       ex.Parameters 
      ); 
     var modifiedEx = 
      Expression.Lambda<Func<TModel, DateTime>>(
       Expression.Property(ex.Body, "Modified"), 
       ex.Parameters 
      ); 

     return new HtmlString(
      "Some things here ..." + 
      helper.HiddenFor(createdEx) + 
      helper.HiddenFor(modifiedEx) 
     ); 
    } 
} 

、その後:カスタムHTMLヘルパーがHTMLの小さな部分を生成するために使用されるべきであると言うこと

@Html.StatusBox(model => model.RowInfo) 

言うまでもないです。複雑さは急速に拡大する可能性があります。この場合、RowInfoタイプのエディタテンプレートを使用することをお勧めします。

+0

RowInfoをStatusBoxエクステンションに渡し、次にhelper.HiddenのRowInfo.CreatedフィールドとRowInfo.Modifiedフィールドの両方を表示するヘルパーを作成したい場合はどうすればよいですか?私は同じようにそれを行うことができますか? –

+0

@ Melissa、私は答えを例で更新しました。 –

+0

それは素晴らしいです。あなたは私の人生をもっと簡単にしました。どうもありがとうございます !! –

関連する問題