ASP.Net MVC Core 2 - Маршрутизация области - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь реализовать Area для администраторов в моем приложении ASP.Net MVC Core 2.

Я настроил маршрут для области следующим образом:

// Default route
app.UseMvc(routes =>
{
     routes.MapRoute(
         name: "default",
         template: "{controller=Home}/{action=Index}/{id?}");
});

// Admin area route
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "admin",
        template: "{area=Admin}/{controller=Home}/{action=Index}/{id?}");
});

Все это работает довольно хорошо.

Этот администратор area использует тот же Layout, что и основной веб-сайт, хотя _ViewStart.cshtml находится в каталоге Areas/Admin/Views, но все равно работает нормально.

Проблема, с которой я сталкиваюсь, связана с компонентом меню навигации, который находится в основном файле макета сайта, и ссылками href во всех якорях, указывающими на неправильный URL-адрес в области администрирования.

Скажите, у меня есть следующие ссылки:

<a asp-controller="Account" asp-action="Index">My Account</a>
<a asp-controller="Shopping" asp-action="Basket">Shopping Basket</a>
<a asp-controller="Admin" asp-action="Users">Manage Users</a>

Находясь внутри области администратора, ссылки теперь относятся к области и, таким образом, выглядят так, как если бы они были следующими:

http://localhost/Admin/Account/Index
http://localhost/Admin/Shopping/Basket
http://localhost/Admin/Admin/Users

Есть ли хороший способ сделать все эти ссылки относящимися к корню сайта?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Есть несколько проблем с настройкой приложения.

  1. Вы не можете использовать app.UseMvc() дважды. Я думаю, что в основном последний переопределит вашу первую настройку. Вот почему вы видите, что все ссылки имеют префикс /admin.
  2. Если вы хотите сгенерировать ссылку на управление вашим пользователем в области admin, вы должны использовать asp-area вместо <a asp-area="admin" asp-controller="users" asp-action="index">Manage Users</a>.

Так я буду настраивать области.

Настройка области маршрута, а также маршрут по умолчанию при запуске

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // The area routing setup has to come before your default routing!
    // Remember the order of these setups is very important!
    // Mvc will use that template as soon as it finds a matching! 

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "areaRoute",
            template: "{area:exists}/{controller=dashboard}/{action=index}/{id?}"
        );

        routes.MapRoute(
            name: "default",
            template: "{controller=home}/{action=index}/{id?}"
    );
}

Настройте базовый контроллер администратора с аннотацией [Area], чтобы вам не приходилось указывать это во всех других контроллерах, которые должны находиться в области администратора.

// Assume you have an Admin area under /Areas/Admin

namespace DL.SO.Web.UI.Areas.Admin.Controllers
{
    [Area("admin")]
    public abstract class AdminControllerBase : Controller
    {
    }
}

Контроллеры под админкой

// Dashboard controller. I know you have home controller inside 
// your admin area but they should work the same.

namespace DL.SO.Web.UI.Areas.Admin.Controllers
{
    public class DashboardController : AdminControllerBase
    {
        public IActionResult Index()
        {
           return View();
        }
    }
}

// Users controller. I know you have User(s) controller but I usually
// just keep the name of the controller singular.

namespace DL.SO.Web.UI.Areas.Admin.Controllers
{
    public class UserController : AdminControllerBase
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

Укажите область с помощью помощника тега привязки

// My habit is to always specify the area with the anchor tag helper.
// For public links (those are not under any areas):
//     I just pass empty string, like asp-area=""
// For links pointing to any controller under any area:
//     Just pass the area, like asp-area="admin"

// http://localhost/account
<a asp-area="" asp-controller="account" asp-action="index">My Account</a>

// http://localhost/shopping/basket
<a asp-area="" asp-controller="shopping" asp-action="basket">Shopping Basket</a>

// http://localhost/admin/user
<a asp-area="admin" asp-controller="user" asp-action="index">Manage Users</a>

// http://localhost/admin/dashboard
<a asp-area="admin" asp-controller="dashboard" asp-action="index">Admin Panel</a>
0 голосов
/ 16 мая 2018

Вы можете редактировать шаблон для URL, который будет отображаться как предпочтительный. то есть изменить на

    template: "{controller=Home}/{action=Index}/{id?}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...