문제

첫 번째 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을 구현하는 객체를 반환하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top