2011-08-01 39 views
5

我想我要做的就是「鏈接」我的數據,以便它看起來一樣。 我所有的HTML必須包裹在某種形式的Razor Helpers與代碼塊共享html問題

<fieldset class="" data-role=""> 

所以我有什麼是打印各種形式的一個幫手。一個將是一個標籤:

<fieldset data-role="@role"> 
    <label>@Html.Raw(label)</label> 
</fieldset> 

現在,當我有多種類型的標籤,其中一個包括代碼塊。當它是一個 簡單的一段文字,如「名」我做的:

@FieldSet.Label("First Name") 

但是,當我有一個代碼塊,如:

<b>some text</b> 
<p>some other text (some time frame - some time frame) 

就變得複雜起來使用此:

@FieldSet.Label("<b>" + Model.Text1 + "</b><p>" + Model.Text2 + 
    " (" + Model.Time1 + " - " + Model.Time2 +")</p>") 

我想什麼它一個解決方案,看起來像這樣:

@FieldSet.Label(@<text> 
<b>@Model1.Text1</b> 
<p>@Model.Text2 (@Model.Time1 - @Model.Time2)</p> 
</text>) 

我在某處讀過這可能,但我找不到這篇文章。我可能完全被誤導了,但我真的不想在代碼背後有一段HTML,我想利用剃刀語法,而不是字符串連接。

+0

即使他們是正確答案,我也不喜歡任何解決方案。我打算爲「最佳實踐」開始一個新線索,也許我會得到一個我可以在那裏使用的答案。 – BradLaney

回答

4

檢查從菲爾哈克此文章

,你可以:

寫入作爲擴展的方法來一個強類型的HtmlHelper:

public static class RazorExtensions 
{ 
    public static HelperResult Label<T>(this HtmlHelper<T> helper, Func<T, HelperResult> template) { 
     return new HelperResult(writer => { 
      writer.Write("<label>"); 
      template(helper.ViewData.Model).WriteTo(writer); 
      writer.Write("</label>"); 
     }); 
    } 
} 

所以,你可以寫

@Html.Label(@<text><span>@Model.Item1<span><strong>@Model.Item2</strong></text>) 

通模式作爲參數傳遞給你的助手方法

public static class FieldSet 
{ 
    public static HelperResult Label<T>(this T model, Func<T, HelperResult> template) { 
     return new HelperResult(writer => { 
      writer.Write("<label>"); 
      template(model).WriteTo(writer); 
      writer.Write("</label>"); 
     }); 
    } 
} 

用法:

@FieldSet.Label(Model, @<div><span>@Model.UserName</span><strong>@Model.FullName</strong><p>@Model.Description</p></div>) 
+0

好讀,但仍然有問題實際上使其工作。他們的實現不支持共享代碼。只是改變循環,這不是我的問題。 – BradLaney

+0

好像我不得不使用動態對象,也是一件壞事。我不得不讓我的幫手接受一個Func <>和我的TModel,然後將模型傳遞給Func <>,並在cshtml中替換模型中的項目。 – BradLaney

+0

這是你期望的結果嗎? @標籤(Func 模板,動態模型,DataRole角色= DataRole.fieldcontain) @Label(role,template.Invoke(model).ToString()); } @ FieldSetHelper.Label(@我的迴應:@ item.Answer(@ item.AnsweredOn),問題)' – BradLaney

3

你可以看看如何@Html.BeginForm已實施。

創建一個實現IDisposable的一類,而直接寫到響應流:

你的代碼可能看起來像這樣(通過頭進入,未測試):

class FieldSet : IDisposable { 
    public FieldSet(string label) { 
      // TODO: Encode label on line below 
      HttpContext.Current.Response.Write(string.Format("<fieldset><label =\"{0}\"", label)); 
    } 

    public void Dispose() { 
     HttpContext.Current.Response.Write("</fieldset>"); 
    } 
} 

static class FieldSetExtionsions { 
    public static FieldSet FieldSet(this HtmlHelper html, string label) { 
     return new FieldSet(label); 
    } 
} 

的使用將是:

@using (Html.FieldSet("your label")) { 
    <div> 
     Your razor code goes here 
    </div> 
} 
+0

這對我來說絕對是最好的方法。畢竟,fieldset應該封裝一組字段。 –