Для вызова этого метода Extension требуется передать первый параметр (this). Ты знаешь почему? - PullRequest
2 голосов
/ 13 марта 2011

В следующем html и методе расширения я получаю следующую ошибку: «Нет перегрузки для метода« MenuLink »принимает 3 аргумента»

Я не думаю, что вам нужно было передавать параметр для«это» парм.

Спасибо

public static class HTMLHelper
{

    public static MvcHtmlString MenuLink(this HtmlHelper htmlHelper, string linkText,  string actionName, string controllerName)
    {
        var routeData = htmlHelper.ViewContext.RouteData;
        string currentAction = routeData.GetRequiredString("action");
        string currentController = routeData.GetRequiredString("controller");

        if (actionName == currentAction && controllerName == currentController)
        {

            return htmlHelper.ActionLink(linkText, actionName, controllerName, null, new { @class = "selected" });
        }

        return htmlHelper.ActionLink(linkText, actionName, controllerName);
    }

}

}

  <ul>         
        <li id="tab10">@HunterEdge.Web.Helper.HTMLHelper.MenuLink("Overview", "Index", "Statistics")</li>   
        <li id="tab20">@HunterEdge.Web.Helper.HTMLHelper.MenuLink("Detail View", "Detail", "Statistics")</li>   
        <li id="tab30">@HunterEdge.Web.Helper.HTMLHelper.MenuLink("Trends", "Trends", "Statistics")</li> 
   </ul> 

Ответы [ 3 ]

2 голосов
/ 13 марта 2011

Вы на самом деле вызываете статический класс HTMLHelper вместо экземпляра HtmlHelper (@Html в виде бритвы).

При вызове метода расширения первый параметр (This) неявно присваиваетсявызывающий объект.Потому что вы не вызываете из экземпляра объекта, но из статического класса нет объекта «this», и из-за этого вам нужно передать его методу.

Надеюсь, это понятнодостаточно ...

http://msdn.microsoft.com/en-us/library/bb383977.aspx

Чтобы сделать это более понятным:

Допустим, у меня есть этот метод расширения

public static class StringExtension
{
         public static void DoSomething(this string stringExtended, string someVar)
         {
           // code
         }
}

и я использую егов моем коде так:

string exampleString; // some assignment
exampleString.DoSomething("abc");

этот вызов в реальности выглядит так:

string exampleString; // some assignment
StringExtension.DoSomething(exampleString,"abc");

При вызове напрямую статическому методу вы должны передать «this», потому что компиляторне знает, что отправить в метод.Обычно не следует вызывать методы Extension напрямую.

1 голос
/ 13 марта 2011

В исходном примере , который я предоставил , я вызывал метод расширения непосредственно в Html:

<ul>
  <li>@Html.MenuLink("Overview", "Index", "Statistics")</li>
  <li>@Html.MenuLink("Detail View", "Detail", "Statistics")</li>
  <li>@Html.MenuLink("Trends", "Trends", "Statistics")</li>
</ul> 

Вы также можете вызывать метод напрямую, когда вы пытаетесь, но вы должны предоставить html помощник в качестве первого аргумента:

<ul>
  <li>@HunterEdge.Web.Helper.HTMLHelper.MenuLink(Html, "Overview", "Index", "Statistics")</li>
  <li>@HunterEdge.Web.Helper.HTMLHelper.MenuLink(Html, "Detail View", "Detail", "Statistics")</li>
  <li>@HunterEdge.Web.Helper.HTMLHelper.MenuLink(Html, "Trends", "Trends", "Statistics")</li>
</ul> 

, что, очевидно, крайне уродливо, и это не то, как методы расширения , которыми являются HTML-помощники, должны были работать.

Причина, по которой вы можете получить сообщение об ошибке, если вы используете первый синтаксис, заключается в том, что вы не добавили метод расширения в область видимости, поместив @using HunterEdge.Web.Helper в верхней части представления или добавив это пространство имен в <namespaces> сечение ~/Views/web.config.

1 голос
/ 13 марта 2011

this как первый параметр метода расширения - это то, что определяет метод расширения в C #.

В этом случае происходит то, что любой экземпляр из HtmlHelper будет иметь методы расширения, казалось бы, представленные в нем как методы экземпляра (хотя это не так), и автоматически первый параметр будет передан.Например, метод вызывается из.

Однако вы также можете вызвать метод расширения, как обычный метод static, и вручную передать первый параметр.Если вы используете статическую ссылку на класс для вызова метода, тогда вы должны предоставить первый параметр.Это похоже на то, что происходит в вашем случае.

Вместо использования статического определения вы должны обращаться к нему, как к обычному методу расширения, используя предоставленные вам экземпляры HtmlHelper.

<ul>         
    <li id="tab10">@Html.MenuLink("Overview", "Index", "Statistics")</li>   
    <li id="tab20">@Html.MenuLink("Detail View", "Detail", "Statistics")</li>   
    <li id="tab30">@Html.MenuLink("Trends", "Trends", "Statistics")</li> 
</ul> 

Это ссылка на MSDN, объясняющая методы расширения для C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...