创建一个htmlhelper扩展方法,但它仍然要求额外的第一个参数

时间:2013-01-09 22:04:26

标签: c# asp.net-mvc model-view-controller extension-methods

我目前创建了一个扩展方法

using System.Web;
 using System.Web.Mvc;

  namespace Mobi.QualityControl.Site.Infrastructure
{
public static class HtmlHelpers
{
    public static HtmlString ActionImage(this HtmlHelper htmlHelper, string action, object routeValues, string imagePath, string alt)
    {
        var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

        // build the <img> tag
        var imgBuilder = new TagBuilder("img");
        imgBuilder.MergeAttribute("src", url.Content(imagePath));
        imgBuilder.MergeAttribute("alt", alt);
        string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);

        // build the <a> tag
        var anchorBuilder = new TagBuilder("a");
        anchorBuilder.MergeAttribute("href", url.Action(action, routeValues));
        anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
        string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);
        return new HtmlString(anchorHtml);
    }
}

}

然后我尝试在我的web.config中使用using语句在我的页面中使用它并且它正在选择方法但它

@ HtmlHelpers.ActionImage(“Account / Register”,“/ images / home / studentstarted.png”,“编辑”,“GettingStarted”)

它说它仍然需要5个参数而不是4个。

这可能非常简单。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

不,你没有正确地打电话给你的助手。它应该是这样的:

@Html.ActionImage("Account/Register", "/images/home/gettingstarted.png", "Edit", "GettingStarted")

ASP.NET MVC中的Html助手只不过是C#中的extension methods,我邀请您在进入ASP.NET MVC之前熟悉它。

基本上在C#中,扩展方法是在它们扩展的类的实例上调用的。在你的情况下,这是HtmlHelper类。 Razor视图有一个名为Html的属性,其类型为HtmlHelper。所以你调用它的扩展方法:

@Html.SOME_EXTENSION_METHOD_THAT_IS_BROUGHT_INTO_SCOPE_BY_A_USING_DIRECTIVE(...)

当然,扩展方法只不过是你也可以像这样调用的静态方法(这是错误的,请不要再调用这样的扩展方法 - 它不是为什么以及如何设计扩展方法):

@HtmlHelpers.ActionImage(Html, "Account/Register", "/images/home/gettingstarted.png", "Edit", "GettingStarted")

注意我如何传递Html作为静态方法的第一个参数。但永远不要使用它。