Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Маршрутизация в MVC Core / 18 сообщений из 18, страница 1 из 1
15.02.2017, 17:50
    #39405179
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
В стандартном приложении задан стандартный маршрут:
Код: c#
1.
2.
3.
4.
5.
6.
app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });



Как сделать, чтобы до перехода по маршруту попасть в свой класс, чтобы выполнить в нем какие-то предварительные действия, а потом отправить дальше по маршруту?
...
Рейтинг: 0 / 0
15.02.2017, 18:22
    #39405194
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
...
Рейтинг: 0 / 0
15.02.2017, 22:11
    #39405303
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
Antonariy,

Вам нужны фильтры на дейстие.
https://metanit.com/sharp/mvc/8.4.php
...
Рейтинг: 0 / 0
16.02.2017, 01:30
    #39405363
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
big-dukeAntonariy,

Вам нужны фильтры на дейстие.
https://metanit.com/sharp/mvc/8.4.php Не, мне нужно Core, а это обычное MVC. hVostt дал нужную ссылку.
...
Рейтинг: 0 / 0
16.02.2017, 08:50
    #39405425
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
Antonariy,

Да, точно, на Core не обратил внимание.
...
Рейтинг: 0 / 0
16.02.2017, 16:03
    #39405884
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
hVostt,

Создал middleware-сервис по образцу: https://metanit.com/sharp/aspnet5/2.20.php

А можно ли получить название контроллера и метода в контексте public async Task Invoke(HttpContext context) без парсинга адресной строки?
...
Рейтинг: 0 / 0
16.02.2017, 16:10
    #39405894
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
AntonariyА можно ли получить название контроллера и метода в контексте public async Task Invoke(HttpContext context) без парсинга адресной строки?

Не, тогда тебе лучше делать фильтр, а не middleware:

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters

потому что до выполнения маршрутизации в Mvc, ничего ещё неизвестно.
...
Рейтинг: 0 / 0
17.02.2017, 13:59
    #39406591
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
hVostt,

Сделал IActionFilter (да и сервис все равно пригодился), и не понял, как в нем прервать переход по маршруту и вернуть заданный controller/action или сразу view?

В примерах предлагается вернуть уже готовый контент:
Код: c#
1.
2.
3.
4.
        public void OnActionExecuting(ActionExecutingContext context)
        {
                context.Result = new ContentResult { Content = "Ресурс не найден" }; 
        }


Я пытался так:

Код: c#
1.
2.
var hc = new Controllers.HomeController();
context.Result = hc.About();

не вышло.

Можно вернуть что-нибудь в ContentResult и сделать context.HttpContext.Response.Redirect, но и без редиректа иногда хотелось бы возвращать не то, что запрошено.

И кстати в mid-сервисе хотелось бы уметь делать тоже самое.

Еще обнаружил, если ввести несуществующие controller/action, выдается пустая страница, до IActionFilter дело соответственно не доходит. В какой момент можно проверить, что маршрут сопоставлен, а если нет, то выдать указанный view?
...
Рейтинг: 0 / 0
18.02.2017, 00:57
    #39406992
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
AntonariyСделал IActionFilter (да и сервис все равно пригодился), и не понял, как в нем прервать переход по маршруту и вернуть заданный controller/action или сразу view?

Нельзя. На момент выполнения IActionFilter, маршрут уже определён, это всего лишь обработка до и после выполнения определённого действия, заставить повторить жизненный цикл по другому маршруту можно только через полноценный редирект. Другой вью (на самом деле, другой результат) вернуть можно через свойство Result контекста фильтра.


AntonariyЯ пытался так:

Возможно, что-то отменяет фильтр. Проверь свойство Canceled в OnActionExecuted.

AntonariyИ кстати в mid-сервисе хотелось бы уметь делать тоже самое.

Cмотри раздел на этот счёт Using middleware in the filter pipeline в https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters

AntonariyЕще обнаружил, если ввести несуществующие controller/action, выдается пустая страница, до IActionFilter дело соответственно не доходит.

Естественно не доходит, фильтр действия работает только поверх существующего и определённого маршрутом действия :)


AntonariyВ какой момент можно проверить, что маршрут сопоставлен, а если нет, то выдать указанный view?

Общая информация здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing

можно определить последним маршрут по умолчанию для любых URL, не попавших под маршрутизацию выше, на определённое действие какое-нибудь. это самый простой путь, но менее гибкий, если потребуется умная маршрутизация, например ЧПУ роутить на живые контроллеры, этот вариант не подойдёт.

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

есть конечно и другие варианты, как накостылячить свой код :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
13.07.2018, 17:03
    #39673833
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
вопрос по Core

условный пример
есть параметр treeId, который должен быть обработан абсолютно во всех маршрутах
каким-то централизованным обработчиком

во всех приложениях используется Windows-авторизация
по treeId лезем в БД, читаем необходимые для работы приложения группы AD
а по samAccountName в AD смотрим, входит ли в такие группы пользователь

как лучше построить маршрут и как потом его обрабатывать?

mySite\myApplication\TreeId\18\controller\action\id\123
или как-то так
mySite\myApplication\controller\action\id\123\TreeId\18

Желательно эту обработку сделать централизованно, чтобы не вешать на каждый метод
...
Рейтинг: 0 / 0
13.07.2018, 19:53
    #39673893
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
andreymx,

Код: c#
1.
2.
3.
                    routes.MapRoute(
                        name: "Tree",
                        template: "tree-{treeId:int}/{area:exists}/{controller}/{action}");



Ну и получайте все URL через маршрут Tree, указывать всегда treeId не нужно, если на контроллер пришёл по маршруту "Tree", в контексте будет уже это значение, которое будет сохраняться.
...
Рейтинг: 0 / 0
16.07.2018, 12:29
    #39674441
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
hVosttandreymx,

Код: c#
1.
2.
3.
                    routes.MapRoute(
                        name: "Tree",
                        template: "tree-{treeId:int}/{area:exists}/{controller}/{action}");




Ну и получайте все URL через маршрут Tree, указывать всегда treeId не нужно, если на контроллер пришёл по маршруту "Tree", в контексте будет уже это значение, которое будет сохраняться.а c каким url-ом это будет работать?

щаз такой
http://localhost:2274/api/values/GetFiltersData
...
Рейтинг: 0 / 0
16.07.2018, 17:04
    #39674606
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
нифига не выходит
есть ли где ссылочка по подходящий мне пример?

Код: c#
1.
2.
3.
4.
5.
6.
7.
            app.UseMvc(
                routes => {
                routes.MapRoute(
                    name: "Tree",
                    template: "tree-{treeId:int}/{area:exists}/{controller}/{action}");
                }
            );



старый маршрут обрабатывается ок
http://localhost:2274/api/values/GetFiltersData


новый как ни пробовал, всё 404 лезет
...
Рейтинг: 0 / 0
16.07.2018, 17:29
    #39674621
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
вот так получается
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
namespace My.Controllers
{
    [Produces("application/json")]
    
    [Route("api/tree-{treeid:int}/[controller]")]
    [Route("api/[controller]")]
    public class ValuesController : Controller

***************

                if (RouteData.Values["treeid"] == null)
                    { TreeId = string.Empty; }
                else
                    { TreeId = RouteData.Values["treeid"].ToString(); }


работает как
http://localhost:2274/api/values/GetFiltersDataGet
так и
http://localhost:2274/api/tree-8/values/GetFiltersDataGet

но это не совсем то, что хотелось бы
...
Рейтинг: 0 / 0
17.07.2018, 00:58
    #39674726
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
andreymxно это не совсем то, что хотелось бы

Ну я показал для примера, а не конечное решение.

Расскажите ещё раз как хотелось бы.
...
Рейтинг: 0 / 0
17.07.2018, 07:49
    #39674791
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
За пример большое спасибо

Чего хочу
Сам получившийся урл меня устраивает
Нужен совет - как централізовано осуществить проверку на основании treeid и других параметров

А то я без опыта
...
Рейтинг: 0 / 0
17.07.2018, 07:58
    #39674795
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
andreymxесть параметр treeId, который должен быть обработан абсолютно во всех маршрутах
каким-то централизованным обработчикомпроверьте что ваши хотелки соответствуют REST.
...
Рейтинг: 0 / 0
17.07.2018, 08:16
    #39674799
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маршрутизация в MVC Core
andreymx,
Тут образцы урл для rest
https://restfulapi.net/resource-naming/
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Маршрутизация в MVC Core / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]