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

本文关键字:后端 mvc net 一次性 | 更新日期: 2023-09-27 18:12:15

我有一个IDisposable HTML helper来创建我在应用程序中经常需要的特定HTML结构。我将它与razor一起使用,它的工作非常完美

    @using (Html.SlidePanel("settings-button"))
    {
         <span>panel content</span>
    }

我有一个基于结构的html helper组件,我想在里面使用我的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);
    }
}

我该如何做到这一点?

谢谢

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

您需要拦截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();
}

就是这样,例子这里

public static class DisposableExtensions
{
  public static IDisposable DisposableDiv(this HtmlHelper htmlHelper)
   {
     return new DisposableHelper(
        () => htmlHelper.BeginDiv(),
        () => htmlHelper.EndDiv());
   }
  public static void BeginDiv(this HtmlHelper htmlHelper)
   {
     htmlHelper.ViewContext.Writer.Write("<div>");
   }

  public static void EndDiv(this HtmlHelper htmlHelper)
   {
     htmlHelper.ViewContext.Writer.Write("</div>");
   }
  }
}

正如你在例子中看到的"Hello Stranger"被放置在额外的div

我找到了一个解决方案,感谢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组件类

中添加公共帮助器
    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();
    }

然后我可以像这样使用SlidePanel

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