需要一个替代我的一次性黑客

本文关键字:我的 一次性 黑客 一个 | 更新日期: 2023-09-27 18:12:13

我目前有一个场景,我重用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>
}

我想更进一步,但我意识到一次性的不是理想的解决方案。

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

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

有什么建议我怎么才能做到这一点吗?如果无法实现,建议我如何在不使用IDisposable的情况下完成我的第一个例子。

我使用MVC 3/4和c#。

谢谢

需要一个替代我的一次性黑客

让你的helper方法接受一个委托。Phil Haack在博客中对此有详细介绍

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>)

只输出你输入的内容。要用div标签包装它,请调用HelperResult

中的writer参数。

Func<dynamic, HelperResult>的原因是传递给方法的标记总是作为一个接受单个参数并返回HelperResult的委托传递进来。在这种情况下,由于您没有传递任何数据,我使用dynamic来保持简单,但如果您阅读上面的链接,您将看到您可以传递任何类型的对象,并且可以通过称为item的特殊变量访问它。

你真聪明。然而,这种编码可能最终会给您带来一些麻烦。假设一位同事试图使用您的类,但不知道它是如何工作的(如何关闭div)。也假设有一天你最终会忘记你在那里做了什么,你试着在using块之外使用它。

我的建议:不要在Dispose方法中做任何与实际处理无关的逻辑。这是一个方法只做它应该做的事情的问题。相反,使用一个静态方法来获取div中所需的任何内容。这个方法必须包装你的html。就像这样:

public static string myMethod(string input)
{
    string result = "<div>" +
      // ...snip
      + input +
      // ...snip
      + "</div>";
    return result;
}