program story

ASP.NET MVC : Razor의 사용자 지정 Html 도우미

inputbox 2020. 11. 23. 08:05
반응형

ASP.NET MVC : Razor의 사용자 지정 Html 도우미


Razor와 함께 사용할 때 Html Helpers에 어려움이 있습니다. 헬퍼는 웹 양식보기 엔진을 사용하여 MVC 2에서 잘 작동했습니다. 하지만 면도기는 아닙니다. 런타임에 발생하는 오류는 다음과 같습니다.

Compiler Error Message: CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments

Source Error:


Line 1:  @using Wingspan.Web.Mvc;
Line 2:  @Html.IncrementalMenu(MenuBlock.Site)

Show Detailed Compiler Output을 확장하면 다음이 표시됩니다.

d:\...\Views\Shared\MenuTop.cshtml(2,1): error CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
d:\...\Views\Shared\MenuTop.cshtml(2,7): error CS1503: Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'

이는 razor가 내 도우미 IncrementalMenu를 좋아하지 않고 void를 반환한다는 것을 나타냅니다 (MVC 2 웹 양식 엔진보기에서 잘 작동 함).

코드 줄 (@ Html.IncrementalMenu (...))에 다음 메시지와 함께 빨간색 밑줄이 표시되어 있지만 컴파일시 오류가 발생하지 않습니다.

Cannot implicitly convert type 'void' to 'object'

IncrementalMenu는 Wingspan.Web.Mvc 네임 스페이스에 있습니다. 서명은 다음과 같습니다.

public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
    // Uses an HtmlTextWriter to render a menu from the sitemap
}

내가 뭘 잘못했는지 안다면 나는 날아간다 ...

추신:

MenuBlock 매개 변수는 메뉴가 렌더링되는 방식을 식별하는 열거 형입니다. 이것에 집착하지 마십시오.


다음과 같이 도우미를 호출 할 수 있습니다.

@{ Html.IncrementalMenu(MenuBlock.Site); }

WebForms 구문

<% Html.IncrementalMenu(MenuBlock.Site); %>

메서드를 호출하면 반환 값 (있는 경우)이 무시됩니다.

다음과 같은 코드는 반환 값을 예상하고 반환 값을 html 스트림에 씁니다.

@Html.YourHelper()

Webforms 구문 :

<%: Html.YourHelper() %>

결과 값! = IHtmlString 인 경우 동일 :

<%= Server.HtmlEncode(Html.YourHelper()) %>

추가:

@ Html.RenderPartial에서 동일하거나 유사한 오류가 발생할 수 있습니다. 이 경우 RenderPartial이 응답에 직접 렌더링하므로 문자열이 아니므로 "Razor 코드 블록"내에 코딩해야합니다.

@{
   Html.RenderPartial(...);
}

이것이 Microsoft가 ASP.NET MVC에 새로운 Html.Partial을 포함시킨 이유 중 하나라고 생각합니다. Html.Partial이 문자열을 반환하므로 다음과 같이 작성해도됩니다.

@Html.Partial

훨씬 좋아 보인다. Razor가 선언 한 목표 중 하나가 눈에 편하다는 점을 감안할 때 이것은 사실 일 가능성이 높습니다.

그것은 또한 적어도 나를 더 편안하게 느끼게합니다. 나는 문자열을 반환하는 것이 무엇인지 알고 있습니다. 그러나 "반응으로 돌아 가기"는 생각할 때마다 몇 번의 더 많은 두뇌주기가 필요합니다.

그리고 마침내 마이크로 소프트가 버전 3에서 제품을 바로 잡았다는 옛 격언과도 잘 맞습니다. EG, Access 97.

그것은 우울한 직유입니다. 버전 4, 즉 Access 2000에서 문제가 발생했기 때문에 ...


HTML 도우미는 Razor (및 WebFormsViewEngine이 아닌 다른보기 엔진)에서 제대로 작동하기 위해 html을 나타내는 MvcHtmlString을 반환해야합니다.

public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
    return MvcHtmlString.Create("<label>" + expression + "</label>");
}

참고 URL : https://stackoverflow.com/questions/4216736/asp-net-mvc-custom-html-helpers-in-razor

반응형