需要一个替代我的一次性黑客
本文关键字:我的 一次性 黑客 一个 | 更新日期: 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;
}