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 컨트롤을 만드는 방법, 나는 구문을 좋아합니다.
다음은 내 패널 위의 헤드 코드입니다.
// 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 Extensions는 오픈 소스이며 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>");
}
}
*코드는 엉망입니다
다른 팁
public void Render()
{
Response.Write(getContentTemplateHandler());
}
당신은 같은 일을하고 싶을 수도 있습니다 Html.BeginPanel()
/ Html.EndPanel()
, 형태가 어떻게 만들어 지는지와 유사합니다 Html.BeginForm()
/ Html.EndForm()
. 이렇게하면 포함 된 컨텐츠를 매개 변수로 전달하는 대신 포함 된 컨텐츠를 랩핑 할 수 있습니다.
제휴하지 않습니다 StackOverflow