使用一次性的.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);
}
}
我该如何做到这一点?
谢谢
您需要拦截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