Создание лямбда-выражения для цели делегата независимо от подписи - PullRequest
0 голосов
/ 20 мая 2010

Хорошо, возможно, название не самая описательная вещь в мире, но эта проблема убивает меня. Я пытаюсь создать вспомогательный метод ActionLinkFor, например:

public ActionResult Index()
{
   // Does Stuff
}

public ActionResult SomeAction(int param1)
{
   // Does Stuff
}

Это два метода действия. Методы действия могут иметь любое количество параметров, но для целей моего выражения мне все равно. В идеале я пытался что-то вроде этого:

<%= Html.ActionLinkFor<HomeController>(m => m.Index, "Return Home") %>

, который вернул бы

<a href="/Home/Index">Return Home</a>

на основе выражения, которое оно проанализировало. Цель в том, что теперь я использую не «магические строки» для определения ссылок, а вместо этого скомпилированное лямбда-выражение. Если что-то было изменено, или страница была изменена, было бы ясно, на какие ссылки указывали.

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

public static MvcHtmlString ActionLinkFor<Controller>(this HtmlHelper helper, Expression<Func<Controller, ActionResult>> methodExpression, string linkName)
{
     // return parsed expression translated into a link
}

public static MvcHtmlString ActionLinkFor<Controller>(this HtmlHelper helper, Expression<Func<Controller, object, ActionResult>> methodExpression, string linkName)
{
    // Does the same thing
}

Таким образом, когда я сказал

m => m.Index // Chooses first ActionLinkFor since the Lambda would be a Func<Controller, object>
m => m.SomeAction // Chooses second ActionLinkFor since the method signature is different.

Однако, похоже, это не работает. Если я укажу несколько общих параметров, например, так:

<%= Html.ActionLinkFor<HomeController, int>(m => m.SomeAction, "Some Link") %>

он прекрасно его подхватывает, но мне не нужно указывать сигнатуру метода в общем списке аргументов. Итак, мои вопросы:

1) Есть ли способ «нацелить» имя метода независимо от его подписи? Я могу использовать отражение, чтобы получить все методы и использовать волшебную строку, но я хочу, чтобы во время разработки было лямбда-выражение, чтобы я мог тогда указать ссылку.

2) Если вы можете предоставить решение, существует ли простой способ анализа имени метода? Алгоритм, который я сейчас использую, скорее всего, плохая идея, и в действительности он включает в себя несколько преобразований и последующий анализ строки, когда я не смог получить более удобный тип.

Ответы [ 2 ]

0 голосов
/ 27 июня 2010

В ASP.Net MVC 2.0 Futures вы можете найти:

Microsoft.Web.Mvc.LinkExtensions.ActionLink<TController>

Это строго типизированный ActionLink Helper.

0 голосов
/ 20 мая 2010

Похоже, я заново изобретаю колесо.Я посмотрю на код MVC Futures.

...