我怎样才能创建Asp.Net MVC模板化控件?
-
10-07-2019 - |
题
我试图创建Asp.Net MVC模板化控件。通过控制模板,我的意思是接受标记作为像这样输入的控制:
<% Html.PanelWithHeader()
.HeaderTitle("My Header")
.Content(() =>
{ %>
<!-- ul used for no particular reason -->
<ul>
<li>A sample</li>
<li>A second item</li>
</ul>
<% }).Render(); %>
请注意:是的,这是非常相似的 Telerik的是如何创建它的MVC控制一>,我喜欢的语法。
下面是我的PanelWithHeader代码:
// Extend the HtmlHelper
public static PanelWithHeaderControl PanelWithHeader(this HtmlHelper helper)
{
return new PanelWithHeaderControl();
}
public class PanelWithHeaderControl
{
private string headerTitle;
private Action getContentTemplateHandler;
public PanelWithHeaderControl HeaderTitle(string headerTitle)
{
this.headerTitle = headerTitle;
return this;
}
public PanelWithHeaderControl Content(Action getContentTemplateHandler)
{
this.getContentTemplateHandler = getContentTemplateHandler;
return this;
}
public void Render()
{
// display headerTitle as <div class="header">headerTitle</div>
getContentTemplateHandler();
}
}
此显示ul
,但我不知道如何我的呈现方法中显示的自定义代码。
我已经使用没有成功的尝试的HtmlHelper。我还试图重写ToString方法,以便能够使用<%=Html.PanelWithHeader()...
语法,但我保持具有语法错误。
我怎样才能做到这一点?
解决方案 2
事实证明,所述 Telerik的MVC扩展是开源和可用在CodePlex上所以我把一个快速浏览源代码。
他们创建从的HtmlHelper实例的ViewContext一个的HtmlTextWriter。当他们写入它,将其写入到页。
代码变为:
// Extend the HtmlHelper
public static PanelWithHeaderControl PanelWithHeader(this HtmlHelper helper)
{
HtmlTextWriter writer = helper.ViewContext.HttpContext.Request.Browser.CreateHtmlTextWriter(helper.ViewContext.HttpContext.Response.Output);
return new PanelWithHeaderControl(writer);
}
public class PanelWithHeaderControl
{
private HtmlTextWriter writer;
private string headerTitle;
private Action getContentTemplateHandler;
public PanelWithHeaderControl(HtmlTextWriter writer)
{
this.writer = writer;
}
public PanelWithHeaderControl HeaderTitle(string headerTitle)
{
this.headerTitle = headerTitle;
return this;
}
public PanelWithHeaderControl Content(Action getContentTemplateHandler)
{
this.getContentTemplateHandler = getContentTemplateHandler;
return this;
}
public void Render()
{
writer.Write("<div class=\"panel-with-header\"><div class=\"header\">" + headerTitle + "</div><div class=\"content-template\">");
getContentTemplateHandler();
writer.Write("</div></div>");
}
}
* I知道,代码乱七八糟
其他提示
public void Render()
{
Response.Write(getContentTemplateHandler());
}
您可能想要做像Html.BeginPanel()
/ Html.EndPanel()
,类似形式如何与Html.BeginForm()
/ Html.EndForm()
创建。这种方式可以包装所包含的内容,而不是需要将其作为一个参数传递。
不隶属于 StackOverflow