Как реализовать маршрутизацию для расширенных маршрутов в файле RouteConfig без создания ошибки маршрута - PullRequest
0 голосов
/ 14 февраля 2019

Я реализовал ссылку выхода из системы в приложении ASP.NET MVC 5 (C #), и она отлично работает с текущей маршрутизацией моего приложения:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Login", id = UrlParameter.Optional });

Когда я вхожу, я вижу выход из системыКнопка, и она работает без проблем.

Однако у меня есть другие области приложения, которые предназначены для зарегистрированных пользователей (для которых я не рассмотрел маршрутизацию), и после перехода в область, предназначенную для авторизованных пользователей, и япри попытке выйти из системы я получаю следующий путь, когда браузер отображает ошибку:

/Managers/Home/LogOff

У меня есть домашний контроллер со ссылкой действия Logoff, но я не знаю, как представить папку «Менеджеры»(вместе с другими на этом уровне).И я не мог найти (и действительно, я не искал исчерпывающе) легкодоступную документацию по маршрутизации за пределами того, что я реализую в моем файле rout.MapRoute (видно выше).Я был бы признателен, если кто-то может направить меня в правильном направлении или сказать мне правильный шаблон для использования.Я не могу представить, что проблема заключается в маршрутизации.Спасибо!

RouteConfig.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace HRCoreUS
{
using System.Web.UI.WebControls;

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 = "Login", id = UrlParameter.Optional });

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Если вы хотите использовать маршрутизацию атрибутов внутри вашей папки Controllers, просто создайте ManagersController

[RoutePrefix("managers")]
public class ManagerController

, а затем просто добавьте атрибут [Route("")] для каждой функции внутри контроллера.В зависимости от любых параметров URL, вам необходимо определить их в атрибуте Route.

[HttpGet, Route("logoff}")]
public HttpResponseMessage LogOff() //route would be Managers/logoff
[HttpGet, Route("{id:int/view-profile}")]
public HttpResponseMessage ViewProfile(int id) //route would be Managers/4/view-profile
[HttpPost, Route("{id:guid/save-profile}")]
public HttpResponseMessage ViewProfile(Guid id) //route would be Managers/405750C8-0B3F-4EF2-A2A2-17A1EFBCDA39/save-profile

Дополнительная информация об атрибутах - https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/

или для общего группового маршрута в Routeconfig вы можете захотеть что-то вроде этого:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { action = "Index", id = UrlParameter.Optional }
    );

Убедитесь, что это последний маршрут, определенный в вашем RouteConfig.

Затем внутри ManagersController.cs создайте

public HttpResponseMessage LogOff()

Этот маршрут будет localhost.com/managers/logoff

Но из того, как я интерпретировал ваш вопрос, кажется, что ваша логика аутентификации связана с конкретным контроллером (Home)?Вы должны иметь всю эту логику, заключенную в нечто вроде AuthenticationController, который может обрабатывать вашу логику входа / выхода.Таким образом, он не зависит ни от чего другого, и у вас может быть маршрут, подобный этому:

    routes.MapRoute(
        name: "Authentication",
        url: "authentication/{action}",
        defaults: new { controller = "Authentication", action = "Index"}
    );

с функцией входа / выхода из системы.Они будут направлены на /authentication/login и /authentication/logoff

0 голосов
/ 14 февраля 2019

Я вижу два варианта определения маршрута, который вам подходит.

Первый вариант: если вы хотите выйти из всех пользователей из определенной папки, вы можете использовать маршрут, подобный следующему.Ключевое слово «allusers» предотвращает конфликт с вашим маршрутом по умолчанию.Это также сделает ваш маршрут более «читабельным».

config.Routes.MapHttpRoute(
    "LogOffAllUserFromFolder",
    "{controller}/{action}/allusers/{folder}",
    new { controller = "Home", action = "Logoff", folder = RouteParameter.Optional });

Эта конечная точка будет выглядеть следующим образом:

/home/logoff/allusers/Managers

Вторая, если вы хотите выйти из системы определенного пользователя (например,Пользователь с идентификатором 124) из папки «Менеджеры», вы можете попробовать следующий маршрут, который не будет конфликтовать с По умолчанию, так как есть 4 аргумента

config.Routes.MapHttpRoute(
    "LogOffSpecificUserFromFolder",
    "{controller}/{action}/{id}/{folder}",
    new { controller = "Home", action = "Logoff", id = RouteParameter.Optional, folder = RouteParameter.Optional },
    new { id = @"\d+" });

Тогда конечная точка будет выглядеть как

/home/logoff/124/Managers

Полагаю, что вы id - это int, и вы можете сказать это, добавив это в определение вашего маршрута.

new { id = @"\d+" }

А так как {folder} - строка, вам больше не нужны другиеопределение, так как это тип по умолчанию.

Если я неправильно пойму вашу точку зрения, я надеюсь, что это даст вам советы о том, как объявлять маршруты MVC.

Будьте осторожны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...