Как изменить URL-адрес с помощью фильтра действий и все еще перенаправить на выполнение маршрута - PullRequest
0 голосов
/ 23 сентября 2018

Цель: У меня есть URL-адрес, подобный http://localhost:55830/shop/116_news - помимо прочего, у фильтра есть задача изменить URL-адрес на http://localhost:55830/shop/news

Я пытался:

filterContext.RouteData.Values[ActionFilter.Value] = "/shop/" + StringHelper.RemoveDiacritics(value.Value.ToLower());
filterContext.ActionArguments[ActionFilter.Value] = "/shop/" + StringHelper.RemoveDiacritics(value.Value.ToLower());
filterContext.HttpContext.Request.Path = "/shop/" + StringHelper.RemoveDiacritics(value.Value.ToLower());

Ни один из указанных выше URL-адресов изменений во время OnActionExecuting

Класс фильтра всего действия:

public class ValueUrlFilterAttribute : ActionFilterAttribute
{
        private readonly IValueTypeRepository repositoryValueType;

        public ValueUrlFilterAttribute(IValueTypeRepository repoValueType)
        {
            repositoryValueType = repoValueType;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string v = filterContext.RouteData.Values[ActionFilter.Value] as string;

            List<string> vInfo = ActionFilter.GetList(v);
            int valueId = ActionFilter.GetValueId(vInfo);
            string valueName = ActionFilter.GetValueName(vInfo);

            ValueType value = repositoryValueType.GetValueByValueId(valueId);

            if (value.Value.ToLower() == valueName)
            {
                object param;

                filterContext.RouteData.Values[ActionFilter.Value] = "/shop/" + StringHelper.RemoveDiacritics(value.Value.ToLower());
                filterContext.ActionArguments[ActionFilter.Value] = "/shop/" + StringHelper.RemoveDiacritics(value.Value.ToLower());
                filterContext.HttpContext.Request.Path = "/shop/" + StringHelper.RemoveDiacritics(value.Value.ToLower());

                if (filterContext.ActionArguments.TryGetValue("value", out param))
                {
                    filterContext.ActionArguments["value"] = value;
                }

                base.OnActionExecuting(filterContext);
            }
        }
}

Я не хочу перенаправлять на другое действие, я хочу перейти надействие, которое я первоначально назвал

PS Отправка нового аргумента filterContext.ActionArguments["value"] = value; отлично работает!

Выпуск Я не знаю, как изменить http://localhost:55830/shop/116_news до http://localhost:55830/shop/news

Спасибо!

1 Ответ

0 голосов
/ 24 сентября 2018

Просто используйте RouteAttribute в соответствии с вашим методом действия:

[Route("shop/news")]
public IActionResult AnythingHere()
{
   return View();
}

Если вам нужно удалить 116 из нескольких URL-адресов, рассмотрите возможность создания глобального шаблона в Startup.cs. Дополнительная информация здесь:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.1

Если вы хотите изменить URL-адрес в браузере, это невозможно без перенаправления.

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