2010-02-22 22 views
13

que estoy tratando de utilizar Html.RenderAction en ASP.NET MVC 2 RC2 de esta manera:Html.RenderAction provoca "No hay ruta en la tabla de rutas coincide con los valores suministrados"

En Controler Menú:

[ChildActionOnly] 
public ActionResult ContentPageMenus() 
{ 
    var menus = _contentPageMenuRepository.GetAll().WithCulture(CurrentCulture); 
    return PartialView(menus); 
} 

Y en mi opinión Index (Índice de la acción del controlador principal):

<% Html.RenderAction("ContentPageMenus", "ContentPageMenu");%> 

pero siempre me sale este mensaje de error: No se ruta en la tabla ruta coincide con los valores suministrados.

Respuesta

0

¿Ha registrado alguna ruta adicional para su aplicación?

+1

Encontré el problema. Siempre elimino la ruta {controller}/{action} y personalizo todas mis rutas con REST minúsculas como las URL. Pero para Html.RenderAction es necesario tener una ruta tan general. Agregué esa ruta general al final de mi lista de rutas y funcionó. –

5

¿Cuál es el nombre de su controlador? Por defecto, lo que sigue es lo que sucede con sus rutas.

El nombre del controlador especificado en su método RenderAction se busca con el "Controlador" adjunto a ese nombre.

Se llama al método de Acción en ese Controlador y se devuelve una Vista.

Así, al mirar en su código, sucederá lo siguiente

  1. Debería haber un controlador llamado "ContentPageMenuController"
  2. Debe haber una acción llamada "ContentPageMenus", que tiene
  3. Usted debería tener una vista llamada ContentPageMenus()

Esto supone que no ha cambiado el enrutamiento predeterminado y no ha agregado los nuevos que afectarán su r salida

+9

Encontré el problema. Siempre elimino la ruta {controller}/{action} y personalizo todas mis rutas con REST minúsculas como las URL. Pero para Html.RenderAction es necesario tener una ruta tan general. Agregué esa ruta general al final de mi lista de rutas y funcionó. –

+0

¡Guau! Me tomó horas averiguar por qué tenía el mensaje de error como se indica en el título de esta pregunta. ¡El comentario aquí me ayudó a resolverlo! ¡Gracias! – Roger

+1

Utilizo el proyecto AttributeRouting, y sería fantástico si hubiera una forma de eliminar la ruta predeterminada, ¡pero aún así RenderAction funciona correctamente! De lo contrario, de vez en cuando me quemo con un ayudante ActionLink mal escrito que da como resultado una URL incorrecta basada en el valor predeterminado, ¡donde realmente preferiría una excepción! –

0

¿Por qué no intentas usar el método fuerte tipado?

Prueba esto:

<% Html.RenderAction<ContentPageMenusController>(x => x.ContentPageMenus()); %> 

usted tiene que llenar exactamente el nombre de la clase.

+0

¿Está disponible en ASP.NET MVC 2 RC2? No puedo ver esto –

+0

sí, es ... Tomé este código de un proyecto que lo usa – vintem

+3

Parece que este método es en realidad de MVC Futures: http://forums.asp.net/p/1565646/3901280.aspx – StriplingWarrior

11

MVC Futures solía permitir la representación de acciones que no tenían rutas. Esto ha cambiado en ASP.NET MVC2.

Si desea que RenderAction funcione y desea ocultar su ruta, no es accesible al público.

  1. Agregue una ruta para su acción en globals.asax.cs.
  2. Decora tu acción con el atributo [ChildActionOnly].
4

Tuve el mismo error. Fue causado al alterar la ruta predeterminada; aparentemente busca explícitamente un nombre de ruta "Predeterminado".

7

La adición de un tercer parámetro como esto era la solución para mí (en la maquinilla de afeitar):

@{Html.RenderAction("ActionName", "ControllerName", new { area = string.Empty });}

+0

Memet - ¿Puedes por favor, avíseme si esta solución está bien o no y no afectará en ningún otro lugar? - Esto soluciona mi problema –

0

he tenido este problema antes, era donde la ruta no incluye el controlador.

  context.MapRoute(
      "Route_default", 
      "Stuff/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 
     ); 

Todavía quería poder llamar a una acción directamente después de la zona, así que agregué la siguiente ruta como tal.

  context.MapRoute(
      "Route_default", 
      "Search/{action}/{id}", 
     new { controller = "Search", action = "Index", id = UrlParameter.Optional } 
     ); 

     context.MapRoute(
      "Route_Controller", 
      "Stuff/{controller}/{action}/{id}", 
      new { controller = "Something", action = "Index", id = UrlParameter.Optional } 
     ); 
Cuestiones relacionadas