1

我目前有一个场景,我重用了 html 代码块。我基本上有一个 div 容器,并且我在整个站点中重复使用该容器及其变体。

该容器由以下 html 组成:

<div class="c_wrapper">
    <div class="c_content">
        CONTENT GOES HERE
    </div>
</div>

*请注意,容器的内容比我指定的要多得多,这是一个基本框架。

我没有在每个页面上多次重新键入容器代码,而是使用 IDisposable 使它更容易一点:

public static class Container
{
    public static ContainerHelper BeginContainer(this HtmlHelper content, int containerSize)
    {
        return new ContainerHelper(content, containerSize);
    }
}

public class ContainerHelper : IDisposable
{
    private readonly HtmlHelper _content;
    public ContainerHelper(HtmlHelper content, int containerSize)
    {
        _content = content;
        var sb = new StringBuilder();
        sb.Append("<div class=\"container_" + containerSize + "\">");
        _content.ViewContext.Writer.WriteLine(sb.ToString());
    }

    public void Dispose()
    {
        var sb = new StringBuilder();
        sb.Append("</div>");
        _content.ViewContext.Writer.WriteLine(sb.ToString());
    }
}

这意味着我现在可以在想要使用容器时简单地使用以下内容:

@using (Html.BeginContainer(24))
{
   <span>hello world... and other content here</span>
}

不过,我想更进一步,我意识到 IDisposable 不是理想的解决方案。

我希望能够做到以下几点:

@Html.Container(24)
{
   <span>hello world... and other content here</span>
}

关于我如何实现这一目标的任何建议?如果它无法实现,关于如何在不使用 IDisposable 的情况下完成我的第一个示例的建议。

我正在使用 MVC 3/4 和 C#。

谢谢

4

2 回答 2

2

Have your helper method take in a delegate. Phil Haack blgoged about this in detail

public static HelperResult Container(int containerSize, Func<dynamic, HelperResult> template)
{
    return new HelperResult(writer => template(null).WriteTo(writer));
}


@Html.Container(24, @<span>hello world... and other content here</span>)

That would just output what you pass in. To wrap it with your div tags, make calls to the writer parameter in the HelperResult

The reason for the Func<dynamic, HelperResult> is that markup passed into the method is always passed in as a delegate that takes a single parameter and returns a HelperResult. In this case since you aren't passing in any data, I used dynamic to keep it simple, but if you read the link from above, you will see that you can pass in an object of any type and it can be accessed via a special variable called item.

于 2013-05-06T12:15:27.967 回答
0

那是相当聪明的。但是,这种编码可能会在以后给您带来一些麻烦。假设一个同事试图使用你的类而不知道它是如何工作的(它是如何关闭 div 的)。还假设有一天你会忘记你在那里做了什么,然后你尝试在一个using街区外使用它。

我的建议:不要在Dispose方法内部做任何与实际处置无关的逻辑。这是一个方法只做它应该做的事情。取而代之的是,有一个静态方法可以在 div 中获取您想要的任何内容。此方法是必须包装您的 html 的方法。像这样:

public static string myMethod(string input)
{
    string result = "<div>" +
      // ...snip
      + input +
      // ...snip
      + "</div>";
    return result;
}
于 2013-05-06T11:34:36.827 回答