c# asp.net-mvc t4mvc

c# - T4MVC de acción fuerte/ActionLink



asp.net-mvc (2)

He estado usando T4MVC (FYI: v2.6.62) durante bastante tiempo, y me he estado moviendo lentamente sobre nuestro código a esta forma de trabajar (menos confianza en las cadenas mágicas ).

Pero tuve que detenerme porque, por alguna razón, T4MVC no puede traducir objetos en direcciones URL, y parece que solo puede trabajar en tipos primitivos (int / string / etc).

Aquí hay un ejemplo:

Desglose de la ruta:

/MyController/MyAction/{Number}/{SomeText}

Clase:

namespace MyNamespace { public class MyClass { public int Number { get; set; } public string SomeText { get; set; } } }

Controlador:

public class MyController { public virtual ActionResult MyAction(MyClass myClass) { return View(); } }

Ver:

<%= Html.Action( T4MVC.MyController.Actions.MyAction( new MyClass() { Number = 1, SomeText = "ABC" } ) %>

El resultado final es este:

/MyController/MyAction?myClass=MyNamespace.MyClass

y no

/MyController/MyAction/1/ABC

¿Alguien más tiene este problema? ¿Están las direcciones URL de T4MVC disponibles?

Pregunta también formulada en el foro de ASP.NET .


Si he entendido el problema correctamente, la siguiente sintaxis debería permitirle solucionar el problema.

<%= Html.ActionLink("test", MVC.MyController.MyAction().AddRouteValues(new MyClass() { Number = 5, SomeText = "Hello" })) %>

Creo que la respuesta para hacer que la sintaxis sea mejor sería envolver cada parámetro de tipo de valor no en RouteValueDictionary en cada método de resultado de acción generado

Edición: (Respuesta a comentar como no hay suficientes caracteres)

Ah, de acuerdo, logré recrear el sencillo ejemplo anterior usando este método para proporcionar: /MyController/MyAction/5/Hello como la url. No estoy muy seguro de cómo se integrarán los tipos complejos anidados en la práctica. Podría usar una cierta recursión para sumergirse en el objeto de nivel superior y reflexionar sobre los valores para agregarlos, pero luego abre un nuevo conjunto de problemas, como la forma de lidiar con un nombre de propiedad secundaria que es idéntico al del padre. nombre de la propiedad. Esto parece que podría ser un problema complejo de resolver, de una manera que funcione para todos. Quizás algún tipo de patrón de adaptador sería más útil para transformar un objeto complejo en valores de ruta. En el caso más simple, esto podría ser declarar un método de extensión ToRouteDictionary que actúa en su tipo complejo y lo transforma usando su conocimiento de cómo debería funcionar. Solo estoy pensando en voz alta ya que obviamente no estoy al tanto de tus casos de uso


Actualización (10/11/2012) : el soporte recientemente agregado para Model Unbinders (vea la sección 3.1 en el doc ) debería cubrir muchos de estos casos.

Respuesta original:

Copiando mi respuesta del hilo del foro :

Hmmm, no creo que esto haya surgido todavía. ¿Tal vez en la mayoría de los casos que las personas tienen métodos de acción que toman un objeto, los valores del objeto provienen de los datos de formulario publicados, en lugar de pasarlos a la URL? En tal escenario, la pregunta no surge.

Creo que, en teoría, T4MVC podría cambiarse para apoyar esto. Solo tendría que promover todas las propiedades de nivel superior del objeto como valores de ruta en lugar de intentar usar el objeto en sí (obviamente, el comportamiento actual es falso y es el resultado de solo llamar a ToString () a ciegas).

¿Hay otros que se encuentran con esto y piensan que vale la pena abordarlo?