asp.net-mvc - net - route c# web api
El enrutamiento de atributos no funciona en áreas (2)
Mover el AreaRegistration.RegisterAllAreas () a RouteConfig.cs no fue suficiente para mí. También necesitaba usar el parámetro AreaPrefix para el atributo de RouteArea:
//Use the named parameter "AreaPrefix"
[RouteArea("AreaName", AreaPrefix = "area-name-in-url")]
[RoutePrefix("controller-name-in-url")]
public class SampleController : Controller
{
[Route("{actionParameter}")]
public ActionResult Index(string actionParameter)
{
return View();
}
}
Editar: en algún momento, me encontré con una solución de muestra de Microsoft que mostraba muy bien cómo manejar el enrutamiento de atributos. También mostró algunos buenos ejemplos de cómo traducir una lista de SelectList
en una matriz de elementos de input[type="radio"]
y hacer lo mismo con una matriz de elementos de input[type="checkbox"]
(si no recuerdo). Esta solución de muestra es probablemente una mejor respuesta a esta pregunta, y también ofrece buenos ejemplos para mostrar botones de opción y elementos de casillas de verificación. Si alguien conoce esta solución de muestra, por favor agregue un comentario con un enlace.
Escenario: tengo un área de Formularios en mi sitio ASP.NET MVC 5.
Estoy intentando redirigir a la Acción de detalles que usa una ruta personalizada definida usando la nueva característica de Enrutamiento de atributos.
El RedirectToAction:
return RedirectToAction("Details", new { slug });
La acción a la que redirijo:
[HttpGet]
[Route("forms/{slug}")]
public ActionResult Details(string slug)
{
var form = FormRepository.Get(slug);
...
return View(model);
}
Esperaría una redirección a http://localhost/forms/my-slug
pero en su lugar la aplicación me está redireccionando a http://localhost/Forms/Details?slug=my-slug
.
Esto significa que el enrutamiento de atributos no funciona.
¿Cómo se puede resolver esto?
He agregado las rutas.MapMvcAttributeRoutes (); línea a mi RouteConfig:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Y aquí está mi Application_Start ():
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Probablemente esté combinando el enrutamiento basado en convenciones con el enrutamiento de atributos, y debe registrar sus áreas después de mapear las rutas de los atributos .
La línea
AreaRegistration.RegisterAllAreas();
debería llamarse DESPUÉS de esta línea:
routes.MapMvcAttributeRoutes();
La explicación (de http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#route-areas ):
Si está utilizando áreas con atributos de ruta y áreas con rutas basadas en convenciones (establecidas por una clase de registro de área), debe asegurarse de que el registro de área se realice después de configurar las rutas de atributos MVC, sin embargo, antes de que la ruta predeterminada basada en convenciones conjunto. La razón es que el registro de ruta debe ordenarse desde los más específicos (atributos) a través de un registro más genérico (área de registro) hasta la ruta genérica (ruta predeterminada) para evitar que las rutas genéricas "oculten" rutas más específicas al hacer coincidir las solicitudes entrantes demasiado pronto. la tubería.
Cuando crea un sitio web asp.net mvc en blanco, agrega un área y comienza a usar el enrutamiento de atributos, encontrará este problema porque la acción "Agregar área" en el estudio visual agrega la llamada RegisterAllAreas en su Application_Start, antes de la configuración de la ruta.
Solución alternativa
Quizás no tenga la intención de seguir utilizando el enrutamiento basado en convenciones y prefiera usar solo el enrutamiento de atributos. En este caso, puede eliminar el archivo FormsAreaRegistration.cs.