2012-04-16 7 views
11

Tengo una página .aspx en la siguiente ruta:Cómo enrutar una página .aspx en el proyecto asp.net mvc 3?

Areas/Management/Views/Ticket/Report.aspx 

Quiero ruta que a la siguiente ruta en el navegador:

http://localhost/Reports/Tickets 

¿Cómo puedo hacer eso?

de que este intento:

routes.MapRoute(
    "Tickets", // Route name 
    "Areas/Management/Views/Ticket/Report.aspx", // Original URL 
    new { controller = "Reports", action = "Tickets" } // New URL 
); 

pero me dio el error 404.

¿Qué estoy haciendo mal?

Obs: pongo eso antes de la ruta Default.

+0

¿Es su página .aspx, una página aspx de formularios web o una página de motor de vista de webforms de mvc? –

+0

es una página .aspx. –

+0

Puedes tener.vistas de aspx que utilizan el motor de vista de formularios web, y puede tener formularios web .aspx. Sospecho que estás tratando de hacer funcionar un híbrido de formularios web y mvc, pero no está claro (al menos para mí) lo que intentas lograr. –

Respuesta

13

¡Solucionado! Por lo tanto, debemos agregar un enrutamiento de ruta a la ruta de formularios web para garantizar que solo se capture en las rutas entrantes, no en la generación de ruta saliente.

Añadir la siguiente clase a su proyecto (ya sea en un nuevo archivo o la parte inferior de global.asax.cs):

public class MyCustomConstaint : IRouteConstraint{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection){ 
     return routeDirection == RouteDirection.IncomingRequest; 
    } 
} 

a continuación, cambiar la ruta Las entradas para el siguiente:

routes.MapPageRoute(
    "Tickets", 
    "Reports/Tickets", 
    "~/WebForms/Reports/Tickets.aspx", 
    true, null, 
    new RouteValueDictionary { { "outgoing", new MyCustomConstaint() } } 
); 
+5

Gracias CodeHobo por esta solución. [Referencia] (http://forums.asp.net/t/1793416.aspx/1) – JabberwockyDecompiler

+0

Soy Vecthor. @JabberwockyDecompiler –

+0

Hmm, no estoy seguro de por qué lo puse, ¿cambió su nombre? – JabberwockyDecompiler

-1

lo estás haciendo al revés. Esto mapea su URL a Areas/Management/Views/Ticket/Report.aspx {controller = "Reports", action = "Tickets" }
lo que u debe hacer en su lugar es establecer la dirección URL como
Reports/Tickets EDIT: - puede crear una routeHandler sólo para encaminar a esta página .aspx .. como este.

public class ASPXRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 

    return BuildManager.CreateInstanceFromVirtualPath("~/Areas/Management/Views/Ticket/Report.aspx", typeof(Page)) as Page; 
    } 
} 

entonces u puede añadir ur ruta a la tabla de rutas existentes utilizando

Route customRoute = new Route("Reports/Ticket",null, new ASPXRouteHandler()); 
     routes.Add(customRoute); 
+0

Si pongo los 'Informes/Tickets' ¿cómo el sitio se enrutará a mi página aspx? –

+0

ull tiene que hacer un controlador de ruta ... actualmente ur url se asigna a Informes/Tickets que obsentan dosent existe ... y por lo tanto obtienes 404. intenta devolver una cadena de "Informes/Tickets" y ull ver dónde estás equivocado –

+0

Amigo No quiero ver que estoy equivocado. "Estoy equivocado", vale, lo sé (es porque estoy aquí ^^), ahora tengo que saber cómo resolver mi problema. =) Un código, un ejemplo, un enlace ... –

-2

si deja el enrutamiento por defecto cuando se crea el proyecto asp.net

public class ReportsController : Controller 
{ 
     public ActionResult Ticket() 
     { 
      return View(); 
     }   
} 

este debería hacer el truco. El enrutamiento en asp.net mvc significa que no vincula directamente a .aspx sino a acciones (métodos) que a su vez devolver una vista apropiada ( .aspx)

+0

Pero con esto, la url (cuando devuelvo la página .aspx) tendrá el .aspx al final, ¿no? –

+0

No, no lo hará. ¿Lo has probado realmente (me has votado)? De hecho, he corregido el código para que devuelva http: // localhost/Reports/Tickets – coffeeyesplease

+0

si intenta utilizar informes cristalinos, entonces debe verificar esta respuesta http://stackoverflow.com/questions/348785/crystal-reports -in-asp-net-mvc – coffeeyesplease

21

Si usted está tratando de utilizar formularios web en un proyecto de MVC, movería su .aspx fuera de la carpeta de vistas, ya que no es realmente una vista, por lo que algo así como WebForms/Tickets/Report.aspx.

En los formularios web puede asignar una ruta llamando al método MapPageRoute.

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.MapPageRoute("Tickets", "Reports/Tickets", "~/WebForms/Tickets/Report.aspx"); 
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

Deberá ponerlo antes de la ruta MVC predeterminada.

+0

Cuando ejecuto el proyecto, el navegador redirige a la siguiente URL "http: // localhost: 37538/Informes/Tickets? Action = Índice y controlador = Iniciar sesión ". Oo –

+0

Está haciendo coincidir la ruta predeterminada en una conjetura, la línea anterior debe estar directamente después de la línea 'routes.IgnoreRoute (" {resource} .axd/{* pathInfo} ")' –

+0

Pongo eso directamente después de las 'rutas. IgnoreRoute ("{resource} .axd/{* pathInfo}") 'y obtuve la misma url. =/ –

Cuestiones relacionadas