2011-11-18 97 views
4

我有以下類別:如何在擴展方法中使用HTML助手方法?

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如下:

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

現在我所要做的是創建一個擴展方法將包含上述內容,並且可以在每個視圖中調用。我嘗試了以下操作。我認爲我在正確的軌道上,但我不知道如何做相當於「model => model.Note.Created」有人可以給我一些建議,我該如何做到這一點,以及我需要用圓括號替換文本。我沒有模型,但我可以通過其他方式做到這一點,所以隱藏的字段將查看我的類以獲取正確的DisplayName,就像它在上面那樣?

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, 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:

的要求,在評論部分這裏是一個修訂版本助手:

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.StatusBox(model => model.RowInfo) 

不用說,自定義HTML傭工應該被用來生成HTML的一小部分。複雜性可能會迅速增長,在這種情況下,我會建議您使用RowInfo類型的編輯器模板。

+0

如果我想將RowInfo傳遞給我的StatusBox擴展,然後有一個幫助程序,例如打印helper.HiddenFor對於RowInfo.Created和RowInfo.Modified字段?我能以同樣的方式做到嗎? –

+0

@梅麗莎,我用一個例子更新了我的答案。 –

+0

太好了。你讓我的生活變得更簡單了。非常感謝 !! –