2009-11-13 46 views
5

Estoy trabajando en una aplicación muy sencilla, utilizando MVC2 de vista previa 1.ruta ASP.NET MVC devolver 404 sin acción

que tiene un controlador llamado ContentController. Mi problema es que/Content/Index funciona correctamente, pero/Content/returns a 404. Estoy ejecutando la aplicación en Studio Development Server.

Probado con RouteDebugger pero/Content/devuelve un 404 y no muestra ninguna información de depuración.

no he cambiado el código de enrutamiento:

 routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

Ésta es mi controlador:

public class ContentController : Controller 
{ 
    IRepository _repo = new SimpleRepository("db", SimpleRepositoryOptions.RunMigrations); 

    public ActionResult Index() 
    { 
     var content = _repo.GetPaged<Content>(0, 20); 
     return View(content); 
    } 
+0

¿Está ejecutando esto en IIS o en el servidor web visual? Si IIS, ¿qué versión? ¿Obtienes el mismo resultado con/Content (vs./Content /)? –

+0

Hm ... Eso es extraño. ¿Puede publicar una captura de pantalla de la salida del depurador de enrutamiento = –

+0

? Estoy ejecutando esto en el servidor web incorporado provisto por Visual Studio 2008. – bq1990

Respuesta

7

Es un tiro en la oscuridad, pero ¿tiene un directorio llamado/Content/también?

+2

¡Bingo! Resulta que la plantilla MVC crea un directorio llamado Contenido donde coloca el archivo Site.css. Ahora me siento como un idiota :(¡Muchas gracias por la ayuda de todos! – bq1990

+0

Lo mismo aquí. Pero mi código creó una carpeta con el mismo nombre de un controlador. – programad

1

/contenido es un controlador, que es básicamente un conjunto de acciones. ASP.NET MVC necesita saber QUÉ acción desea ejecutar, por lo que al omitir la acción, asp.net mvc no sabe qué acción devolver y le da un 404.

Puede indicarlo como predeterminado al agregar una ruta:

por ejemplo:

routes.MapRoute("ContentDefault", "Content", new {controller = "Content", action = "Index"}); 

los atributos se definen como sigue:

'ContentDefault`: Nombre de la ruta (debe ser único en su tabla de enrutamiento)

contenido: El segmento de URL (intentar cambiar esto a 'Contenido/Mucho/Mayor/URL' y luego ir a http://localhost/Content/Much/Longer/URL para ver cómo funciona esto)

nuevo controlador {= .., action =. ..}: qué combo controlador/acción ejecutar para esta ruta.

También podría invalidar HandleUnknownAction en su controlador:

protected override void HandleUnknownAction(string actionName) 
    { 
     return RedirectToAction("index"); 
    } 

Ah, y por cierto, una pieza extra de consejos sobre el encaminamiento .... si se agrega algo a la ruta entre llaves {} éstas serán pasados a la acción como un atributo.

p. Ej./Contenido/Mucho/Mayor/Url/{página}

por lo que la URL http://localhost/Content/Much/Longer/Url/999

pasará el 999 en su acción, como el atributo de página

public ActionResult Index(int Page) { } 

Me encanta MVC - Nunca volver a WebForms - ¡así es como debe ser el desarrollo web!

+0

Gracias por la información, esto es muy específico para lo que estoy trabajando. – bq1990

Cuestiones relacionadas