2009-11-25 11 views

Respuesta

12

Usted debe construya adecuadamente sus rutas en la tabla de rutas. Ej .:

routes.MapRoute("MyRoute" ,"{controler}/{id}#{detail}" ,new { controller = "users", action = "index", id = (string)null, detail = "Summary" }); 
0

Hago algo así en mi sitio here. Pero no es con RedirectToRouteResult. RedirectToRouteResult no es compatible con incluir una parte de anclaje en la url.

Necesita construir el enlace usted mismo y tal vez incluso la lógica para manejar el procesamiento de la parte de anclaje, como yo lo hice. Mi aplicación intenta replicar una funcionalidad similar a la de las vistas de la galería de fotos de Facebook. Cada enlace a una página diferente debe tener una URL única, así que para esto utilizo la parte de anclaje. Pero como no se traduce directamente a una ruta, tengo que analizar manualmente la parte de anclaje de la url en la página y usar ajax para cargar el contenido apropiado. Esto es lo que quería, así que funciona para mí.

+1

Eso es todo; Sé que puedo construir una URL yo mismo, pero quiero beneficiarme de las comprobaciones de tipo fuerte en mis pruebas de unidad al afirmar, por ejemplo. –

+1

veo. bueno, creo que no tienes suerte, entonces –

0

Descargar el source code of MVC y echa un vistazo a cómo funciona RedirectToRouteResult

Puede haber mejores maneras, pero una herencia sencilla de RedirectToRouteResult y una anulación de los ExecuteResult para permitir que una parte de anclaje opcional debería solucionar el problema

5

UrlHelper.GenerateUrl incluye un parámetro de fragmento. He creado un método de extensión

 public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues) 
     { 
      return UrlHelper.GenerateUrl(
       routeName: null, 
       actionName: actionName, 
       controllerName: controllerName, 
       routeValues: new System.Web.Routing.RouteValueDictionary(routeValues), 
       fragment: fragment, 
       protocol: null, 
       hostName: null, 
       routeCollection: url.RouteCollection, 
       requestContext: url.RequestContext, 
       includeImplicitMvcValues: true /*helps fill in the nulls above*/ 
      ); 
     } 

Luego he creado una clase RedirectToFragmentResult

public class RedirectToFragmentResult: RedirectResult 
{ 
    public UrlHelper Url {get;set;} 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Fragment { get; set; } 
    public object RouteValues { get; set; } 
    public RedirectToFragmentResult(UrlHelper url, string action, string controller, string fragment, object routeValues) 
     :base(url.Action(action, controller, fragment, routeValues)) 
    { 
     Url = url; 
     Action = action; 
     Controller = controller; 
     Fragment = fragment; 
     RouteValues = routeValues; 
    } 
} 

a continuación, puedes crear una nueva RouteValueDictionary (result.RouteValues) en su unidad de prueba para comprobar que la forma en que lo haría con un RedirectToRouteResult.

+0

Gracias @Joel Esto parece funcionar muy bien. Sin embargo, no es necesario tener una propiedad de URL local (lo que arroja una advertencia de 'oculto'). Probé con líneas eliminadas: 'UrlHelper Url pública {get; set;} 'y' Url = url; '- ¿alguna razón por la cual esto está allí? – Chris

+1

Lo utilicé para la conveniencia de la depuración, así que puedo tener acceso al urlhelper desde la ventana del reloj, pero está en lo correcto en esa base (url.Action es la última vez que se usa en tiempo real y no es necesario probarla) –

Cuestiones relacionadas