Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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# 使用一次性助手.net mvc后端_C#_Asp.net Mvc_Razor_Html Helper - Fatal编程技术网

C# 使用一次性助手.net mvc后端

C# 使用一次性助手.net mvc后端,c#,asp.net-mvc,razor,html-helper,C#,Asp.net Mvc,Razor,Html Helper,我有一个IDisposable HTML助手来创建我在应用程序中经常需要的特定HTML结构。我把它和剃须刀一起使用,效果非常好 @using (Html.SlidePanel("settings-button")) { <span>panel content</span> } @使用(Html.SlidePanel(“设置按钮”)) { 面板内容 } 我有一个基于结构的html助手组件,我想在里面使用我的SlidePanel

我有一个IDisposable HTML助手来创建我在应用程序中经常需要的特定HTML结构。我把它和剃须刀一起使用,效果非常好

    @using (Html.SlidePanel("settings-button"))
    {
         <span>panel content</span>
    }
@使用(Html.SlidePanel(“设置按钮”))
{
面板内容
}
我有一个基于结构的html助手组件,我想在里面使用我的SlidePanel

public class MyComponent : IHtmlString
{
    private readonly HtmlHelper html;

    public MyComponent(HtmlHelper html)
    {
        this.html = html;
    }

    public override string ToString()
    {
        return Render();
    }

    public string ToHtmlString()
    {
        return ToString();
    }

    private string Render()
    {
        // I want to use my SlidePanel at this place

        string renderHtml = "<div>component html</div>";
        return renderHtml;
    }
}

public static class MyComponentHtmlHelper
{
    public static MyComponent MyComponent(this HtmlHelper html)
    {
        return new MyComponent(html);
    }
}
公共类MyComponent:IHtmlString
{
私有只读HtmlHelper html;
公共MyComponent(HtmlHelper html)
{
this.html=html;
}
公共重写字符串ToString()
{
返回Render();
}
公共字符串ToHtmlString()
{
返回到字符串();
}
私有字符串呈现()
{
//我想在这里用我的幻灯片面板
字符串renderHtml=“组件html”;
返回renderHtml;
}
}
公共静态类MyComponentHtmlHelper
{
公共静态MyComponent MyComponent(此HtmlHelper html)
{
返回新的MyComponent(html);
}
}
我怎样才能做到这一点


谢谢

您需要截取SlidePanel通常发送到常规输出的字符串。像这样的方法应该会奏效:

var originalWriter = html.ViewContext.Writer;
using (var stringWriter = new StringWriter())
{
    html.ViewContext.Writer = stringWriter;
    using (html.SlidePanel())
    {
        stringWriter.Write("<div>component html</div>");
    }
    html.ViewContext.Writer = originalWriter;
    return stringWriter.ToString();
}
var originalWriter=html.ViewContext.Writer;
使用(var stringWriter=new stringWriter())
{
html.ViewContext.Writer=stringWriter;
使用(html.SlidePanel())
{
Write(“组件html”);
}
html.ViewContext.Writer=originalWriter;
返回stringWriter.ToString();
}
比如,给你

公共静态类可配置扩展
{
公共静态IDisposable DisposableDiv(此HtmlHelper HtmlHelper)
{
返回新的DisposableHelper(
()=>htmlHelper.BeginDiv(),
()=>htmlHelper.EndDiv());
}
公共静态void BeginDiv(此HtmlHelper HtmlHelper)
{
htmlHelper.ViewContext.Writer.Write(“”);
}
公共静态void EndDiv(此HtmlHelper HtmlHelper)
{
htmlHelper.ViewContext.Writer.Write(“”);
}
}
}

正如您在附加div中的示例“Hello陌生人”中所看到的,由于Baximilian和StriplingWarrior的回答,我找到了一个解决方案

  • 是的,我需要截取SlidePanel通常发送到常规输出的字符串。所以我不能使用ViewContext.Writer
  • 是的,我需要向我的SlidePanel构造函数发送一个参数
因此,解决方案是向SlidePanel类添加第二个构造函数:

    public string HtmlString;

    public SlidePanel(Func<string> begin, Func<string> content, Func<string> end)
    {
        this.HtmlString = string.Format("{0}{1}{2}", begin(), content(), end());
    }
然后,我可以像这样使用我的SlidePanel:

    new SlidePanel(
    () => html.BeginSlidePanel(), 
    () => html.ContentSlidePanel(GetMyHtmlContent()), 
    () => html.EndSlidePanel()).HtmlString

非常感谢

如果我理解正确,试着看看这个答案
    public static string BeginSlidePanel(this HtmlHelper html)
    {
        return BeginHtml();
    }

    public static string ContentSlidePanel(this HtmlHelper html, string htmlString)
    {
        return htmlString;
    }

    public static string EndSlidePanel(this HtmlHelper html)
    {
        return EndHtml();
    }
    new SlidePanel(
    () => html.BeginSlidePanel(), 
    () => html.ContentSlidePanel(GetMyHtmlContent()), 
    () => html.EndSlidePanel()).HtmlString