Несколько универсальных параметров в методе расширения html-помощника - PullRequest
4 голосов
/ 14 апреля 2010

То, что я пытаюсь сделать, - это создать метод расширения для HtmlHelper, чтобы создать определенный вывод и связанные детали, такие как TextBoxFor <>. То, что я хочу сделать, это указать свойство из класса модели согласно TextBoxFor <>, затем связанное действие контроллера и другие параметры.

Пока сигнатура метода выглядит так:

public static MvcHtmlString Create<TModel, TProperty, TController>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Expression<Action<TController>> action, object htmlAttributes)
        where TController : Controller
        where TModel : class

Проблема возникает, когда я иду, чтобы позвонить. На мой взгляд, если я вызываю его в соответствии с TextBoxFor без указания типа модели, я могу указать лямбда-выражение, чтобы установить свойство, для которого оно предназначено, но когда я иду, чтобы указать действие, я не могу.

Однако, когда я указываю тип контроллера Html.Create<HomeController>( ... ), я не могу указать свойство модели, для которого должен быть создан элемент управления.

Я хочу иметь возможность называть это как

<%= Html.Create<HomeController>(x => x.Title, controller => controller.action, null) %>

Я уже несколько часов бьюсь головой об этой проблеме за последний день, может кто-нибудь указать мне правильное направление?

Edit: Спасибо за ответы на это.

Таким образом, без указания всех типов, я думаю, что я могу жить с

<%= Html.Create(x => x.Title, ((HomeController)controller) => controller.action, null) %>

Но все же нужна ссылка на действие, а не на само действие

* вернемся к размышлениям:)

Редактировать # 2:

Я начинаю думать, что попытка сделать его строго строго типизированным немного надуман. Идти по тем же путям, что и предоставляемые методы расширения вспомогательного html, может быть, просто указав имя действия и имя контроллера в качестве строковых параметров - это путь ?! Но наверняка то, что я пытаюсь сделать, возможно? удар головой

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Я думаю, что самое близкое, что вы можете получить:

<%= Html.Create(x => x.Title, (HomeController c) => c.Index(), null) %>
0 голосов
/ 14 апреля 2010

Параметры типа не могут быть выведены. У вас нет выбора, кроме как вызвать его как (предположим, ваш TModel имеет тип Book, а заголовок имеет тип string)

<%= Html.Create<Book, string, HomeController>(x=>x.Title, controller=>controller.SomeAction(), null) %>

В противном случае он не будет знать, через какой контроллер ему следует выполнить действие.

С уважением.

...