2012-02-06 28 views
20

我有一個名爲EditableArea助手提供用戶與運行時可編輯div(經由JS)。 EditableArea輔助檢查可編輯區域具有指定ID(不涉及MVC的Area)在數據庫中存在,如果是的話那麼它呈現區域的HTML,否則它會顯示作爲一個參數指定的助手默認標記:ASP.Net MVC3 - 通行證剃刀標記作爲參數

這一切工作正常,但我想改變它,這樣默認的標記沒有作爲一個字符串,但在剃刀語法指定的,是這樣的:

@using (Html.EditableArea(someId)) 
{ 
    <p>Click to edit contents</p> 
} 

或者類似的,像這樣的東西@section小號在MVC3中工作。

我該如何做到這一點?

我可以作出IDisposable這是Dispose關閉TagBuilder等,但我不能避免渲染內剃刀標記即使Helper發現與ID的區域(我可以清除處置所呈現的內容()但{}中的代碼仍然會運行,我想跳過)。

如果我不使用using是否有其他方式將剃刀塊傳遞給幫助器,該幫助器可能會或可能不會由幫助器實際渲染?

回答

25

下面是我使用的Id和剃鬚刀風格的語法傳遞一個模板,模板本身來呈現jQuery的模板標記,例如:

public static MvcHtmlString jQueryTmpl(this HtmlHelper htmlHelper, 
    string templateId, Func<object, HelperResult> template) 
{ 
    return MvcHtmlString.Create("<script id=\"" + templateId + 
     "\" type=\"x-jquery-tmpl\">" + template.Invoke(null) + "</script>"); 
} 

,這將與

@Html.jQueryTmpl("templateId", @<text>any type of valid razor syntax here</text>) 

被稱爲基本上只需使用Func<object, HelperResult>作爲參數,並使用template.Invoke(null)(必要時帶參數)來渲染它。顯然,您可以跳過.Invoke()的電話以避免呈現「默認」標記。

+0

它不工作。該' ...'函數調用內部語法不被認可(無效表達術語「<」) – 2012-02-06 11:13:04

+0

對不起,前面加上''以「@'(我更新了我的答案) – 2012-02-06 11:17:22

+1

大,現在的工作。''標籤根本不需要('@'就夠了),除非剃鬚刀標記實際上是沒有標籤的純文本,否則只需'@'就足夠了。 – 2012-02-06 11:27:09

3

只是爲了擴大接受的答案,因爲我花了一段時間來解決類似的問題,這是一個彈出的問題。我真正需要的是@helper,它會接受剃刀文本,因爲模板應該包含相當多的代碼。我玩了很長一段時間,試圖使用我在網絡上找到的幾種@helper item(Func<object, HelperResult> input)版本,但都沒有成功。所以我去像一個辦法:

namespace project.MvcHtmlHelpers 
{ 
    public static class HelperExtensions 
    { 
     public static MvcHtmlString RazorToMvcString(this HtmlHelper htmlHelper, Func<object, HelperResult> template) 
     { 
      return MvcHtmlString.Create(template.Invoke(null).ToString()); 
     } 
    } 
} 

@project.MvcHtmlHelpers  
@helper item(other input, MvcHtmlString content) 
    { 
     <div class="item"> 
      ...other stuff... 
      <div class="content"> 
       @content 
      </div> 
     </div> 
    } 

,並使用此通過

@item(other input, @Html.RazorToMvcString(@<text>this is a test</text>)) 

現在我可以用這兩種剃刀輸入輔助模板,但我也可以部分視圖下降,這在某些方面很方便。由於我不是專家,可能會有更好的選擇,但對我來說這似乎是一個靈活的方法。