2012-06-09 57 views
4

我需要將所有腳本放在頁面底部,問題在於當我有局部視圖時我無法使用「RenderSection」方法。發現如何添加的HtmlHelper擴展,它需要一個腳本文件的名稱,一個很好的例子,加載到堆棧,然後又幫助將呈現出對基地佈局: Razor section inclusions from partial viewMVC 4 - 如何將模板傳遞給html幫助器方法

這是偉大的 - 但我不想要爲一小段腳本創建一個完整的JS文件,或者甚至是我想要放入的HTML文件。而且我不想將它全部作爲字符串傳遞,我想要很好的格式化和智能感知,所以我想用一個模板,即:

@{Html.AddScript("test", @<text> 
<script type="text/javascript"> 
    function RefreshPreview() { 
     $('#AutoReplyHtml_Preview').html(
      $('#htmlTemplate').html() 
       .replace('@@[email protected]@', $('#AutoReplySubject').val()) 
       .replace('@@[email protected]@', $('#AutoReplyPreHeader').val()) 
       .replace('@@[email protected]@', $('#AutoReplyHtml').val()) 
     ); 

     $('#AutoReplyPlainText_Preview').html(
      $('#plainTextTemplate').html() 
       .replace('@@[email protected]@', $('#AutoReplyPlainText').val()) 
     ); 
    } 

    $(document).ready(function() { 
     RefreshPreview(); 
    }); 
</script> 
</text>);} 

問題是 - 怎麼我得到模板的值到我的方法,我有這樣的代碼符合,但不知道如何獲取數據出來的「code」參數:

public static string AddScript(this HtmlHelper htmlHelper, string title, Func<object, object> code) { 
    var ctx = htmlHelper.ViewContext.HttpContext; 
    Dictionary<string, string> scripts = ctx.Items["HtmlHelper.AddScript"] as Dictionary<string, string>; 
    if (scripts == null) { 
     scripts = new Dictionary<string, string>(); 
     ctx.Items.Add("HtmlHelper.AddScript", scripts); 
    } 

    scripts.Add(title, code.ToString()); //Doens't work! 

    return string.Empty; 
} 

如何調整委託參數以獲取模板內的值?

回答

2

幫助程序體系結構的設計使其可以適應您提供模板的場景,例如,該模板可用於列表中的每個項目。在這種情況下,你當然希望能夠在遍歷列表時將「當前」項傳遞給它。

但是,在其他情況下(例如您的),不是當前項目。然而,正如你發現的那樣,你仍然需要聲明一個委託作爲你的方法的一個參數,它定義了一個使用一個參數的方法。沒關係 - 因爲你沒有在你的幫手中使用這個參數(你沒有在模板中使用神奇的item參數),所以你可以在你的實現中將它傳遞給null。優選地,聲明您的參數爲Func<object, IHtmlString>而不是Func<object, object>,但無論如何,只需調用code(null).ToString()即可獲取需要呈現的HTML編碼的字符串。

+2

完美!這正是我所需要的 - 當涉及到Func時,仍然是一個新手 - 只需要調整一下,就必須使其成爲IHtmlString:public static IHtmlString AddBottomContent(this HtmlHelper htmlHelper,string title,Func code)然後將「code(null).ToString()」轉儲到字典中,以便以後輸出! –

+0

嗯,有趣。我在我的代碼中使用'HelperResult'(實現'IHtmlString'),但我很高興你提到它;也許'IHtmlString'更一般,我應該在我的代碼中使用。 –

相關問題