2010-03-04 15 views
17

He estado usando T4MVC (FYI: v2.6.62) durante bastante tiempo, y he estado cambiando lentamente nuestro código a esta forma de trabajar (menos dependencia de magic strings).Acción T4MVC fuertemente tipada/ActionLink

Pero he tenido que parar porque, por alguna razón, T4MVC no puede traducir objetos a las URL, y solo parece poder trabajar en tipos primitivos (int/cadena/etc).

Aquí es un ejemplo:

Ruta desglose:

/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(); 
    } 
} 

Vista:

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

El resultado final es la siguiente:

/MyController/MyAction?myClass=MyNamespace.MyClass 

y no

/MyController/MyAction/1/ABC 

¿Alguien más tiene este problema? ¿Están disponibles las URL T4MVC como esta?

Pregunta también hecha en el ASP.NET Forum.

Respuesta

17

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

Respuesta original:

Copia de mi respuesta desde el forum thread:

Hmmm, no creo que esto ha llegado 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 del formulario publicado, en lugar de ser pasados ​​en la URL? En tal escenario, la pregunta no surge.

Creo que, en teoría, T4MVC podría cambiarse para soportar esto. Solo necesitaría promocionar 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 simplemente llamar a ToString() a ciegas).

¿Han encontrado otros que piensan que vale la pena abordarlo?

+1

Hola David. Gracias por la respuesta. Supongo que, dadas las 5 votaciones ascendentes en el breve período transcurrido, significa que esta es probablemente una funcionalidad deseable. :-) –

+0

Ok, lo pondré en la lista de TODO! :) –

+0

¡Gracias! Me resultaría especialmente útil ya que he creado algunos ActionResults, como PermanentRedirectResult, que utilizan las acciones de estilo T4MVC, y este tipo de funcionalidad sería genial, ¡no solo para usar en vistas! –

4

Si entendí 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 la sintaxis más agradable sería para envolver cada parámetro no tipo de valor en un RouteValueDictionary en cada generaron método resultado de la acción

Editar: (respuesta al comentario que no hay suficientes caracteres)

Ah ok Me las arreglé para recrear el ejemplo simple anterior utilizando este método para dar: /MyController/MyAction/5/Hello como la url. No estoy muy seguro de cómo funcionarían los tipos complejos anidados en la práctica. Puede utilizar alguna recursividad para sumergirla en el objeto de nivel superior y reflejar los valores para agregarlos, pero luego abre un nuevo conjunto de problemas, como cómo lidiar con un nombre de propiedad hijo que sea idéntico al padre. nombre de la propiedad. 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 sobre 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 sus casos de uso

+0

Me temo que esto no funciona. Devuelve los valores de la ruta, pero url no se forma correctamente. Además, si se soluciona con este método de ajuste del tipo sin valor, tendrá que hacerlo de forma recursiva, porque podría estar utilizando un tipo complejo que contenga otros tipos complejos ... –

+0

editado en respuesta al comentario anterior – PabloBlamirez

Cuestiones relacionadas