ASP.NET MVC3 HtmlHelper扩展方法,如BeginForm,使用局部视图?

时间:2014-02-13 17:09:31

标签: asp.net-mvc-3 razor html-helper

我根据this answer创建了一个针对SO问题c# - How can I create a Html Helper like Html.BeginForm - Stack Overflow的扩展方法,它运行正常。

我可以将扩展方法中的嵌入式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 个答案:

答案 0 :(得分:1)

我还没有找到任何方法将“嵌入式HTML”精确地转移到局部视图中,但是以一种提供HTML和Razor语法高亮显示和Intellisense的方式封装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(...){ ... }语法,所以我很高兴将其作为解决方案。