맞춤형 HTML 도우미 : "사용"명령문 지원으로 도우미 생성
-
21-08-2019 - |
문제
첫 번째 ASP.NET MVC 응용 프로그램을 작성하고 있으며 사용자 정의 HTML 도우미에 대한 질문이 있습니다.
양식을 만들려면 다음을 사용할 수 있습니다.
<% using (Html.BeginForm()) {%>
*stuff here*
<% } %>
맞춤형 HTML 도우미와 비슷한 일을하고 싶습니다. 다시 말해, 나는 변화하고 싶다 :
Html.BeginTr();
Html.Td(day.Description);
Html.EndTr();
안으로:
using Html.BeginTr(){
Html.Td(day.Description);
}
이게 가능해?
해결책
다음은 C#의 재사용 가능한 구현입니다.
class DisposableHelper : IDisposable
{
private Action end;
// When the object is created, write "begin" function
public DisposableHelper(Action begin, Action end)
{
this.end = end;
begin();
}
// When the object is disposed (end of using block), write "end" function
public void Dispose()
{
end();
}
}
public static class DisposableExtensions
{
public static IDisposable DisposableTr(this HtmlHelper htmlHelper)
{
return new DisposableHelper(
() => htmlHelper.BeginTr(),
() => htmlHelper.EndTr()
);
}
}
이 경우 BeginTr
그리고 EndTr
응답 스트림에 직접 작성하십시오. 문자열을 반환하는 확장 메소드를 사용하는 경우 다음을 사용하여 문자열을 출력해야합니다.
htmlHelper.ViewContext.HttpContext.Response.Write(s)
다른 팁
여기 MVC3에 제공된 조언을 따르려고했지만 다음을 사용하는 데 어려움을 겪었습니다.
htmlHelper.ViewContext.HttpContext.Response.Write(...);
이 코드를 사용했을 때, 도우미가 레이아웃이 렌더링되기 전에 응답 스트림에 글을 쓰고있었습니다. 이것은 잘 작동하지 않았습니다.
대신 나는 이것을 사용했다 :
htmlHelper.ViewContext.Writer.Write(...);
ASP.NET MVC 소스를 보면 코드 플렉스), The BeginForm의 구현이 결국 다음 코드로 호출되는 것을 볼 수 있습니다.
static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
TagBuilder builder = new TagBuilder("form");
builder.MergeAttributes<string, object>(htmlAttributes);
builder.MergeAttribute("action", formAction);
builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
htmlHelper.ViewContext.HttpContext.Response.Write(builder.ToString(TagRenderMode.StartTag));
return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
}
mvcform 클래스는 idisposable을 구현합니다.u003C/form> 응답에.
따라서, 당신이해야 할 일은 헬퍼 메소드에 원하는 태그를 작성하고 idisposable을 구현하는 객체를 반환하는 것입니다.
제휴하지 않습니다 StackOverflow