ASP.NET MVC:カミソリでカスタムのHTMLヘルパー
-
26-09-2019 - |
質問
私は、HTMLヘルパーの難しさを持っています。ヘルパーはWebフォーム・ビュー・エンジンと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)
の表示は、コンパイラの出力が明らかに詳細な拡大
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'
かみそりはなく、私のヘルパーのように、IncrementalMenu、(MVC 2 Webフォームエンジンビューで罰金を働く)voidを返す。ないことを私に示して:コードの行は、(@ 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
}
私が間違っているものを知っていれば私はフェラしています...
PSます:
MenuBlockパラメータはメニューによってレンダリングされる識別し、どのように単に列挙型です。それは結構です、この上にない固視行います。
解決
あなたはこのようなあなたのヘルパーを呼び出すことができます:
@{ Html.IncrementalMenu(MenuBlock.Site); }
Webフォームの構文
<% Html.IncrementalMenu(MenuBlock.Site); %>
(もしあれば)あなたは単に無視され、あなたの方法、および戻り値を呼び出します。
このようなコードは、戻り値を期待して、HTMLストリームに戻り値を書き込みます:
@Html.YourHelper()
Webフォームの構文ます:
<%: Html.YourHelper() %>
同じ、もし結果の値= IHtmlString:!
<%= Server.HtmlEncode(Html.YourHelper()) %>
他のヒント
補遺:
あなたは、@ Html.RenderPartialと同じ、または類似した、エラーを取得することができます。この場合、そのように、れるrenderPartial応答に直接レンダリングするという事実に起因する「カミソリのコードブロック」内部符号化される文字列と必要はない。
@{
Html.RenderPartial(...);
}
私は、MicrosoftがASP.NET MVCで新しいHtml.Partialが含まれていることを理由の一つであると思います。 Html.Partialは、文字列を返す場合と同様に、それは書き込みにOKです。
@Html.Partial
かなり良く見える。カミソリの宣言目的の一つは、目の上に簡単なことであることを考えると、これは非常に可能性が真です。
これも一種になり、私の、少なくとも、より快適に感じます。私はそれをすべての時間を行う、文字列を返すことは何であるかを知っています。しかし、「応答に戻ることは」少数のより多くの脳サイクル私はそれを考えるたびに必要です。
そして、それは最終的にMicrosoftが正しいバージョン3で自社製品を得ること古い格言に収まるEG、アクセス97
押し下げ直喩である。彼らは、バージョン4で物事を台無しCOS、すなわち、Access 2000の...
あなたのHTMLヘルパー適切に(WebFormsViewEngineではなく、他のビューエンジン)カミソリを使用するためにHTMLを表しMvcHtmlStringを返す必要があります。
public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
return MvcHtmlString.Create("<label>" + expression + "</label>");
}