Obtener acción del controlador utilizando una expresión lambda

asp.net-mvc c# expression-trees

Pregunta

Estoy tratando de crear un método que cree una URL basada en el nombre de control y el nombre de acción. No quiero usar cadenas mágicas, así que estaba pensando en un método que tomara una expresión lambda como parámetro.

La parte difícil es que no quiero especificar ningún parámetro en el método de acción. Así, por ejemplo, si tengo este controlador:

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

Me gustaría llamar al método así:

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

La firma del método que he encontrado es:

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

Pero esto no resuelve el problema de saltarse los parámetros. Mi método solo se puede llamar con el parámetro especificado de esta manera:

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

¿Es posible especificar una acción o método en un controlador sin tener que configurar los parámetros?

Respuesta aceptada

No es posible omitir los parámetros con un árbol de expresiones a menos que tenga parámetros opcionales o predeterminados dentro de sus métodos de acción. Debido a que los árboles de expresiones se pueden compilar en un código ejecutable, el compilador todavía valida la expresión, por lo que debe ser un código válido, los parámetros del método y todo.

Como en el ejemplo de Dan a continuación, suministrar un parámetro predeterminado es tan simple como:

public ActionResult Index(int Id = 0)

Además, como los métodos de acción tienen que devolver algún tipo de resultado, su Expresión debería ser del tipo Expression<Func<TController, object>> , que permitirá que cualquier tipo de objeto sea devuelto desde el método definido en la expresión.

Definitivamente echa un vistazo a MVCContrib .


Respuesta popular

Utilice T4MVC . Esta es la mejor opción para eliminar todas las cadenas mágicas y hacer mucho más.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow