0

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

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("账户/注册", "/images/home/gettingstarted.png", "编辑", "GettingStarted")

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

这可能是非常简单的事情。任何帮助,将不胜感激。

4

1 回答 1

2

不,您没有正确调用您的助手。它应该是这样的:

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

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

基本上在 C# 中,扩展方法是在它们扩展的类的实例上调用的。在你的情况下,这就是HtmlHelper类。Razor 视图有一个名为Htmlwhich 的属性,其类型为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作为静态方法的第一个参数传递的。但永远不要使用它。

于 2013-01-09T22:05:12.983 回答