2016-02-26 35 views
0

我想將一些自定義模板應用於剃刀視圖。這有點特別,所以這裏是一個例子。剃刀視圖中的自定義模板

讓我們說出模型包含一個具有名字和姓氏的Person對象。

模板看起來像這樣女巫我將在CSHTML文件寫

<div data-template-id="testTemplate" data-template-model="@Model.Person"> 
<span>{{Firstname}}</span> 
<span>{{Lastname}}</span> 
</div> 

然後,我會作出這樣的填充從Model.Person

與數據模板的HtmlHelper方法

所以哈日我有有權訪問數據,但我不知道如何訪問視圖並獲取模板。

public static MvcHtmlString Test<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression){ 
    var model = html.ViewData.Model; 
     string propName = ""; 
     if (expression.Body is MemberExpression) 
      propName = ((MemberExpression)expression.Body).Member.Name; 
     var value = model.GetType().GetProperty(propName).GetValue(model, null); 
     // TODO: get template and insert data from model 
     return new MvcHtmlString($"<div>{value}</div>"); 
} 

我知道這有點奇怪,爲什麼我會這樣做。但簡短的回答是,在某些情況下,我需要根據一些內部條件返回一些完全不同的html。在這種情況下,我會完全刪除模板。

+0

第一我建議你描述一下你需要做什麼,如果沒有htmlhelper,因爲在我看來你是過於複雜的東西。如果你真的需要傳遞模型和模板,你可以這樣做:public static IHtmlString Test(這個HtmlHelper helper,ModelType模型,字符串模板),然後在剃刀Html.Test(Model,@「your template here」); – eugen

+0

我沒有按照你的建議輸入模板的原因是由於我打算如何使用它。在編寫模板/標記時,我希望Visual Studio智能感知和代碼格式化。如果我把它寫成字符串輸入的話,那將會全部丟失。 – Galtrold

回答

0

我找到了解決這個問題的方法,我自己。我最終傳遞了一個@helper方法作爲模板。像這樣

public static MvcHtmlString Test<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
{ 
    var someCondition = false; 

    if (someCondition) 
    { 
     // Return some domain specific html. 
     return new MvcHtmlString("<div></div>"); 
    } 
    else 
    { 
     var result = expression.Compile(); 

     TModel model = html.ViewData.Model; 

     var value = result(model); 

     var r = new MvcHtmlString(value.ToString()); 
     return r; 
    } 
} 

然後,我會像這樣使用:

@Html.Test(p => ImageTemplate(p.Avater)) 
@helper ImageTemplate(Picture avater) 
{ 
    <h1 style="color: red">@avater.Title</h1> 
    <h5>@avater.Url</h5> 
} 

這種方法提供了代碼格式化,智能感知,可重用性,當然,覆蓋孔的東西的能力。