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
enAdmin
-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"})