Получить действие от контроллера с помощью лямбда-выражения - PullRequest
4 голосов
/ 05 июля 2011

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

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

public class HomeController : IController
{
  public Index(int Id)
  {
     ..
  }
}

Я хотел бы вызвать метод следующим образом:

CreateUrl<HomeController>(x=>x.Index);

Подпись метода, который я придумал:

public string CreateUrl<TController>(Expression<Action<TController>> action) where TController : IController

Но это не решает проблему пропуска параметров.Мой метод может быть вызван только с параметром, указанным так:

CreateUrl<HomeController>(x=>x.Index(1));

Можно ли указать действие или метод на контроллере без необходимости установки параметров?

Ответы [ 3 ]

4 голосов
/ 05 июля 2011

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

Как и в примере Дана ниже, предоставление параметра по умолчанию так же простоas:

public ActionResult Index(int Id = 0)

Кроме того, поскольку методы действия должны возвращать какой-либо результат, ваше выражение должно иметь тип Expression<Func<TController, object>> , что позволит любому типу объекта бытьвозвращается из метода, определенного в выражении.

Определенно извлечен MVCContrib .

3 голосов
/ 05 июля 2011

Использование T4MVC . Это лучший вариант, чтобы удалить все магические строки и сделать гораздо больше

1 голос
/ 05 июля 2011

Как сказал bdowden, вы должны предоставить параметры или значения по умолчанию для таких параметров:

public class HomeController : IController
{
  public Index(int Id = 0)
  {
     ..
  }
}

Кроме того, если вы используете MVCContrib , эти методы расширения уже существуют. (проверьте URLHelperExtentions).

...