Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要我的IDisposable Hack的替代品吗_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 需要我的IDisposable Hack的替代品吗

C# 需要我的IDisposable Hack的替代品吗,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我目前有一个场景,我重复使用html代码块。我基本上有一个div容器,我在整个站点重复使用该容器及其变体 容器由以下html组成: <div class="c_wrapper"> <div class="c_content"> CONTENT GOES HERE </div> </div> 内容在这里 *请注意,容器的内容比我指定的要多得多,这是一个基本框架 我没有在每个页面上多次重新键入容器代码,而是使用ID

我目前有一个场景,我重复使用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());
    }
}
公共静态类容器
{
公共静态容器Helper BeginContainer(此HtmlHelper内容,int containerSize)
{
返回新的ContainerHelper(内容,containerSize);
}
}
公共类容器帮助器:IDisposable
{
私有只读HtmlHelper\u内容;
公共容器帮助器(HtmlHelper内容,int containerSize)
{
_内容=内容;
var sb=新的StringBuilder();
某人加上(“”);
_content.ViewContext.Writer.WriteLine(sb.ToString());
}
公共空间处置()
{
var sb=新的StringBuilder();
某人加上(“”);
_content.ViewContext.Writer.WriteLine(sb.ToString());
}
}
这意味着我现在只要想使用容器,就可以简单地使用以下内容:

@using (Html.BeginContainer(24))
{
   <span>hello world... and other content here</span>
}
@使用(Html.BeginContainer(24))
{
你好,世界…和其他内容在这里
}
不过,我想更进一步,我意识到IDisposable不是理想的解决方案

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

@Html.Container(24)
{
   <span>hello world... and other content here</span>
}
@Html.Container(24)
{
你好,世界…和其他内容在这里
}
对我如何实现这一目标有什么建议吗?如果无法实现,请提供有关如何在不使用IDisposable的情况下完成第一个示例的建议

我使用的是MVC 3/4和C#


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

我的建议是:不要在
Dispose
方法中执行任何与实际Dispose无关的逻辑。这是一种只做它应该做的事情的方法。相反,要有一个静态方法,在div中获取您想要的任何内容。此方法必须包装html。就这样,

public static string myMethod(string input)
{
    string result = "<div>" +
      // ...snip
      + input +
      // ...snip
      + "</div>";
    return result;
}
公共静态字符串myMethod(字符串输入)
{
字符串结果=“”+
//…剪断
+输入+
//…剪断
+ "";
返回结果;
}

让助手方法接收委托。菲尔·哈克(Phil Haack)在一家报纸上大肆宣扬此事

publicstatichelperresult容器(int containerSize,Func模板)
{
返回新的HelperResult(writer=>template(null).WriteTo(writer));
}
@容器(24、@hello world…和此处的其他内容)
这只会输出您传入的内容。要使用
div
标记将其包装,请调用
HelperResult
中的
writer
参数


使用
Func
的原因是传递到方法中的标记始终作为委托传递,委托接受单个参数并返回
HelperResult
。在这种情况下,由于您没有传递任何数据,我使用了
dynamic
来保持简单,但是如果您从上面阅读链接,您将看到您可以传递任何类型的对象,并且可以通过名为
item

的特殊变量访问它,可能我误解了。。但是为什么不能调用一个返回
IHtmlString
的函数呢?你的例子是不可能的。。但也许我的建议合适?顺便说一句那不是黑客。我总是在某些地方使用它。事实上,我已经看到过许多以完全相同的方式扩展HtmlHelpers的例子。我写html,所以我在using的括号中放的任何东西都会被div包装起来。你能举个例子说明我将如何使用IHtmlString实现同样的功能吗?我的观点是,你不能像使用
一样使用
来支撑它。在任何上下文中,右括号都不会像使用
块时的
那样说“好了,我完成了,处理掉我并调用此代码”<代码>使用
就是这样,因为它转换成了一个
try..finally
“幕后”。不适用于这里的讨论,但是这里多余的
StringBuilder
的使用确实让我感到困扰。也许不应该,但我忍不住被它惹恼了。ASP.NET MVC在自己的助手中使用
IDisposable
(例如用于
构造)。任何使用MVC的人都应该意识到这一点。我认为使用它是这里的首选方案。我无法对此进行投票
htmlHelper
一直都是这样扩展的。我到处都能看到。即使是框架也大量使用了它。这意味着我需要将我的内容作为字符串传递,它基本上消除了使用块的所有逻辑可能性。这个解决方案没用。然而,我同意我在这里使用IDisposable的问题是不正确的,因此我正在寻找一个alternative@DustyRoberts为什么你要考虑这个问题(使用<代码> IDISPABLE < /COD>像这样)当整个ASP.NET MVC框架到处使用它时,是不是很糟糕的做法?我在“C**”中写HTML……加上。。。IDisposable用于帮助清理对象。我想要一个场景,在这个场景中,我可以使用某种“EditorTemplate”或“DisplayTemplate”,其中我的html位于我的视图页面中。(做梦:)或者甚至像“section()”这样的东西@DustyRoberts你可以在那里使用逻辑。例如,您可以在类中使用变量来保持状态、某种字符串缓冲区以及更改所述状态的方法。。。当您全部完成时,您只需在一个Write方法中输出整个内容
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>)