paginacion net mvc filtros filtro datos busqueda buscar buscador asp c# asp.net asp.net-mvc routes area

c# - net - paginacion mvc razor



Registro de área de ASP.NET MVC (5)

¿Has intentado decorar tu clase de controlador con atributos de ruta?

[Area("Admin")] [Route("Categories")] public class CategoriesController : Controller

Esto funcionó para mí en un problema similar que estaba teniendo, aunque estaba usando ASPNET Core, ¿qué versión de MVC estás usando?

Tengo un pequeño problema con mi registro de área "Administrador", que se almacena en AdminAreaRegistration.cs dentro de la carpeta del área "Administrador". Mis rutas se ven así:

context.MapRoute( "Admin_News", "Admin/News", new { controller = "News", action = "Index" } ); context.MapRoute( "Admin_Pages", "Admin/Pages", new { controller = "Pages", action = "Index" } ); context.MapRoute( "Admin_Galleries", "Admin/Galleries", new { controller = "Galleries", action = "Index" } ); context.MapRoute( "Admin_Categories", "Admin/Categories", new { controller = "Categories", action = "Index" } ); context.MapRoute( "Admin_Products", "Admin/Products", new { controller = "Products", action = "Index" } ); context.MapRoute( "Admin_Files", "Admin/Files", new { controller = "Files", action = "Index" } ); context.MapRoute( "Admin_Orders", "Admin/Orders", new { controller = "Orders", action = "Index" } ); context.MapRoute( "Admin_Codes", "Admin/Codes", new { controller = "Codes", action = "Index" } ); context.MapRoute( "Admin_Login", "Admin/Login", new { controller = "Login", action = "Index" } ); context.MapRoute( "Admin_Panel", "Admin", new { controller = "Index", action = "Index" } ); context.MapRoute( "Admin_Default", "Admin/{controller}/{action}/{param}", new { param = UrlParameter.Optional } );

El problema es: cuando inicio sesión en la publicación, uso

return Redirect("~/Admin");

Todo está bien, hasta que quiera hacer clic en el enlace (que está generando bien)

<li><a href="@Url.RouteUrl("Admin_Categories")">Categories</a></li> == <li><a href="~/Admin/Categories">Categories</a></li>

Entonces, se supone que debo redirigirme a la acción Index del controlador de Categorías, pero en su lugar me redirigen a la acción Index del controlador de inicio de sesión. ¿Alguna idea de por qué está sucediendo así?

¡Atentamente!

EDIT 1:

Bueno, cambié la ruta de Admin_Categories por esta:

context.MapRoute( "Admin_Categories", "Admin/Categories/{action}", new { controller = "Categories" } );

Parece que funciona, pero ahora url está generando con nombre de acción, que no sería así en caso de acción de índice:

<li><a href="@Url.RouteUrl("Admin_Categories")">Categories</a></li> == <li><a href="~/Admin/Categories/Index">Categories</a></li>

¿Cómo puedo eliminar el nombre de la acción de la url?

EDIT 2

Bueno, de alguna manera mi navegador almacenaba en caché el control de categorías Vista de acción del índice como controlador de inicio de sesión Vista de acción del índice. El problema fue resuelto por un tiempo después de borrar el caché del navegador. Utilicé el atributo de caché siguiente para todas las vistas (solo usé VarByParam para las vistas que necesitan parámetros):

[OutputCache(CacheProfile = "OneDayCache")]

Pero incluso borrar el caché no repara el problema. Todavía estoy siendo redirigido a la acción del Índice de controlador de inicio de sesión ... ¿Alguna idea?

EDIT 3

Usé esos AreaRoutes:

context.MapRoute( "Admin_Categories", "Admin/Categories", new { controller = "Categories", action = "Index", param = UrlParameter.Optional }, new[] { "AMBIT_CMS_MVC.Areas.Admin.Controllers" } ); context.MapRoute( "Admin_Default", "Admin/{controller}/{action}/{param}", new { controller = "Index", action = "Index", param = UrlParameter.Optional }, new[] { "AMBIT_CMS_MVC.Areas.Admin.Controllers" } );

Lo usé para crear la url de ruta:

@Url.RouteUrl("Admin_Categories")

Pero aún no funciona como debería. Las rutas de administrador se registran en Global.asax y no hay ninguna ruta que pueda anular esas ...

EDIT 4

Descubrí que mi problema es el almacenamiento en caché. De alguna forma, Chrome almacena en caché mi ubicación de / Admin / Categories como / Admin / Login, de modo que cuando toco url / Admin / Categories, la caché la está redirigiendo a / Admin / Login.

Uso el atributo OutputCache, pero parece que no funciona correctamente.

[OutputCache(CacheProfile = "OneDayCache", VaryByCustom = "Url")] public ActionResult Index(){...}

VaryByCustom configurado en Global.asax:

public override string GetVaryByCustomString(HttpContext context, string arg) { if (arg.Equals("Url")) { string url = !string.IsNullOrWhiteSpace(context.Request.Url.AbsoluteUri) ? context.Request.Url.AbsoluteUri : string.Empty; return "Url=" + url; } return base.GetVaryByCustomString(context, arg); } http://localhost:50945/Admin/Categories HTTP/1.1 302 Found Cache-Control: private, max-age=86400 Content-Type: text/html; charset=utf-8 Expires: Thu, 09 Feb 2017 20:24:19 GMT Last-Modified: Wed, 08 Feb 2017 20:24:19 GMT Location: /Admin/Login Server: Microsoft-IIS/10.0 X-AspNetMvc-Version: 5.2 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?TTpcUHJvamVrdHlcQU1CSVQtQ01TLU1WQ1xBTUJJVCBDTVMgTVZDXEFkbWluXENhdGVnb3JpZXM=?= X-Powered-By: ASP.NET Date: Wed, 08 Feb 2017 20:24:19 GMT Content-Length: 439

Tal vez este VaryByCustom no esté funcionando. ¿Alguna idea para solucionarlo?


Tu código de enrutamiento me parece bien. ¿Estás seguro de que en el método de inicio de sesión estás autenticado correctamente? Intente quitar la etiqueta [Autorizar] de su controlador de "Categorías" y vea si la autorización es el problema.


Para su primera edición:

El tercer parámetro registra los valores predeterminados. Te estás perdiendo la action predeterminada.

Cambia tu ruta a esto, y funcionará:

context.MapRoute( "Admin_Categories", "Admin/Categories/{action}", new { controller = "Categories", action = "Index" } );

La mejor solución:

¿Por qué no simple eliminar todo pero esto:

context.MapRoute( "Admin_Default", "Admin/{controller}/{action}/{param}", new { param = UrlParameter.Optional } );

Esto significa, por ejemplo, que la solicitud /Admin/Foo/Bar se resuelve de la siguiente manera:

  • Encuentra FooController en Admin -rea
  • Call Bar -Método en ello.

Entonces simple use esto para generar URL''s

@Url.Action("ActionName", "ControllerName", new { Area = "AreaName" })

Quizás quieras tener esto:

context.MapRoute( "Admin_Default", "Admin/{controller}/{action}/{param}", new { controller = "Index", action = "Index", id = UrlParameter.Optional } );

Si llamas

@Url.Action("Index", "ControllerName", new { Area = "AreaName" })

La Url generada sería /AreaName/ControllerName lugar de /AreaName/ControllerName/Index .

Si llamas

@Url.Action("Index", "Index", new { Area = "AreaName" })

La Url generada sería /AreaName lugar de /AreaName/Index/Index .

Todos juntos deben usar este registro de área:

public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { controller = "Index", action = "Index", id = UrlParameter.Optional } ); } }

Solo crea una nueva ruta si realmente la necesitas. Entonces no olvide configurar los valores predeterminados en el tercer parámetro de MapRoute .

También tenga en cuenta que es importante escribir la acción, si ya está en una vista desde el mismo controlador:

@Url.Action("SomeAction")

Y si está en una vista desde la misma área, pero quiere llamar a otro controlador, puede escribir esto:

@Url.Action("SomeAction", "SomeController")


Esta es una implementación básica de la función de Área en MVC:

En su AdminAreaRegistration.cs:

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

Decora tus Controladores con:

[Area("Admin")] public class MyController : Controller

Además, no olvide agregar la siguiente línea de código en global.asax , en su método Application_Start() (además de todo):

AreaRegistration.RegisterAllAreas();

En uso de vista:

Url.Action("Index", "Categories", new { Area = "Admin" })

De esta manera debería funcionar bien. ¡Probado!


solo hazlo, así:

en la configuración de ruta:

routes.MapRoute( name: "mesaj_fiyatsor", url: "mesaj/fiyatsor/{kimeId}/{kimdenId}/{stokId}", defaults: new { controller = "mesaj", action = "fiyatsor", kimeId = "", kimdenId = "", stokId = "" }, namespaces: new string[] { "ProjectName.Bla.Controllers" } );

en el registro de área:

context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new[] { "ProjectName.Bla.Areas.Bla.Controllers" } );

entonces:

@Url.Action("index", "destek", new { area="bla"})