2014-02-13 104 views
1

我創建了一個基於this answer的SO問題c# - How can I create a Html Helper like Html.BeginForm - Stack Overflow的擴展方法,它工作正常。使用部分視圖的ASP.NET MVC3 HtmlHelper擴展方法(如BeginForm)?

我可以將擴展方法中的嵌入式HTML移動到局部視圖中,並在該方法中使用該局部視圖,同時保留它的當前行爲?特別是,我希望能夠'包裝'任意HTML的塊。

我不問任何迫切的需求,而只是出於希望保持一致的HTML,例如作爲觀點和部分觀點。我想如果它在視圖或局部視圖中,發現HTML的任何問題都會容易得多。

這裏的HtmlHelper擴展方法:

public static IDisposable HelpTextMessage(this HtmlHelper helper, bool isHidden, string heading) 
{ 
    TextWriter writer = helper.ViewContext.Writer; 

    writer.WriteLine(
     String.Format(
      "<div class=\"help-text {0}\">", 
      isHidden ? "help-text-hidden" : "")); 

    writer.WriteLine(
     String.Format(
      "<div class=\"help-text-heading\">{0}</div>", 
      heading)); 

    writer.Write("<div class=\"help-text-body\">"); 

    return new HelpTextMessageContainer(writer); 
} 

這裏的HelpTextMessageContainer類:

private class HelpTextMessageContainer : IDisposable 
{ 
    private readonly TextWriter _writer; 

    public HelpTextMessageContainer(TextWriter writer) 
    { 
     _writer = writer; 
    } 

    public void Dispose() 
    { 
     _writer.Write("</div></div>"); 
    } 
} 

在視圖中,我可以使用擴展方法是這樣的:

@using(Html.HelpTextMessage(Model.HelpText.IsHelpTextHidden(Model.SomeHelpMessage), "Something")) 
{ 
    @:To do something, first do something-more-specific, then do another-something-more-specific. 
} 

或者我也可以這樣使用它:

@using(Html.HelpTextMessage(Model.HelpText.IsHelpTextHidden(Model.SomeHelpMessage), "Something")) 
{ 
    <p>To do something, first do something-more-specific, then do another-something-more-specific.</p> 
    <p>Also, keep in mind that you might need to do something-else-entirely if blah-blah-blah.</p> 
} 

回答

1

我還沒有找到任何方法將「嵌入式HTML」完全轉換爲局部視圖,但以提供HTML和Razor語法突出顯示和智能感知的方式封裝HTML的稍微更友好的方法是移動到應用App_Code文件夾下的文件中的視圖幫助函數中,如this post on "Hugo Bonacci's Blog"中所述。

這是我的助手功能:

@helper HelpTextMessage(bool isHidden, string heading, Func<object, object> content) 
{ 
    <div class="help-text @(isHidden ? "help-text-hidden" : "")"> 
     <div class="help-text-heading"> 
      @heading 
     </div> 
     <div class="help-text-body"> 
      @content(null) 
     </div> 
    </div> 
} 

假設上述輔助函數是在在App_Code文件夾名爲ViewHelpers.cshtml文件,也可以在這樣的觀點被稱爲:

@ViewHelpers.HelpTextMessage(false, "Something", 
    @:To do something, first do something-more-specific, then do another-something-more-specific. 
) 

或本:

@ViewHelpers.HelpTextMessage(false, "Something", 
    <p>To do something, first do something-more-specific, then do another-something-more-specific.</p> 
    <p>Also, keep in mind that you might need to do something-else-entirely if blah-blah-blah.</p> 
) 

我喜歡在視圖中嵌入HTML,因爲我可以使用@using(Html.HelpTextMessage(...){ ... }語法,所以我很高興將它作爲解決方案。

+0

剛剛救了我一天...... :) –

相關問題