Динамика расширений HtmlHelper - PullRequest
3 голосов
/ 24 мая 2011

Я привык к методам расширения, представляемым intellisense, после того, как введен тип this.Но когда я пытаюсь сделать это с помощью HtmlHelper, методы расширения не отображаются, даже если присутствует оператор using.Почему это?Чтобы уточнить, я делаю этот тест из обычного файла .cs, а не файла .cshtml.Нет веской причины, я просто играю с пространством имен MVC и языком, чтобы «увидеть, как это работает».Я до сих пор не знаю, почему intellisense не принимает все 4000 расширений (я преувеличиваю, но их много).

Говоря о тысячах расширений, почему эти вспомогательные процедуры предоставляются как методы расширения?Если бы использовались типичные статические классы, то, вероятно, образец сигнатуры бритвы был бы:

@EditorExtensions.EditorFor<T>(...)

Кажется выполнимым, а в «Руководстве по разработке структуры» говорится, что расширения следует использовать редко, и предпочтительно:

  1. только против типов интерфейса.
  2. только для типов, которые не могут быть повторно развернуты

Не похоже, что применяется какой-либо из «критериев» метода расширения.Вот почему я ожидал, что регулярные статические классы со статическими методами будут заполнять этот список.Каково было обоснование?

Обновление: Пример кода помощника без расширения (для дальнейшего обсуждения)

public static class MyHelper
{
    public static MvcHtmlString Go(HtmlHelper foo){
        foo.Raw("Hello");
        return new MvcHtmlString("<p>What's up Doc</p>");
    }
}

1 Ответ

2 голосов
/ 24 мая 2011

Не уверен, почему IntelliSense не показывает HtmlHelper методы расширения для вас.Вы уверены, что вы using System.Web.Mvc.Html?

Причина, по которой эти помощники были реализованы как методы расширения, заключается в том, что им часто требуется доступ к различным состояниям, связанным с запросом, моделью и т. Д. Это намного большеТрудно достичь этой цели, в то же время делая помощников тестируемыми по модулю, если они были реализованы как статические методы.

...