C# 如何通过操作筛选器更改url并仍然重定向到执行路由

C# 如何通过操作筛选器更改url并仍然重定向到执行路由,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,Aim:我有一个类似http://localhost:55830/shop/116_news-除其他外,过滤器的任务是将url更改为http://localhost:55830/shop/news 我试过: filterContext.RouteData.Values[ActionFilter.Value] = "/shop/" + StringHelper.RemoveDiacritics(value.Value.ToLower()); filterContext.ActionArgument

Aim:我有一个类似
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

全动作过滤器类:

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);
            }
        }
}
公共类值UrlFilterAttribute:ActionFilterAttribute
{
私有只读IValueTypeRepository repositoryValueType;
公共价值UrlFilterAttribute(IValueTypeRepository repoValueType)
{
repositoryValueType=repositoryValueType;
}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
字符串v=filterContext.RoutedData.Values[ActionFilter.Value]作为字符串;
List vInfo=ActionFilter.GetList(v);
int valueId=ActionFilter.GetValueId(vInfo);
字符串valueName=ActionFilter.GetValueName(vInfo);
ValueType value=repositoryValueType.GetValueByValueId(valueId);
if(value.value.ToLower()==valueName)
{
对象参数;
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参数))
{
filterContext.ActionArguments[“value”]=value;
}
base.OnActionExecuting(filterContext);
}
}
}
我不想重定向到另一个操作,我想转到我最初调用的操作

PS发送新参数
filterContext.ActionArguments[“value”]=value工作得很好

问题我不知道如何更改
http://localhost:55830/shop/116_news
http://localhost:55830/shop/news


谢谢

只需在您的操作方法中使用RouteAttribute:

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

如果您需要从多个URL中删除116,请考虑在Stututu.CS中生成全局模板:这里的更多信息:


如果您想在浏览器中更改URL,那么在没有重定向的情况下是不可能的。

问题是什么?它已经解决了吗?我不知道如何更改->
http://localhost:55830/shop/116_news
http://localhost:55830/shop/news
您使用
ActionFilterAttribute
有什么具体原因吗?似乎您想重写请求url,如果是这样,您可以尝试测试我制作的archon,如下所示:
@v.Value
现在我对正则表达式有问题:
AddRewrite(@“^shop/(.*)valueId=(\d+),“shop/$1”,true)
.AddRedirect(@“shop/116_news(.*),“shop/news$1”)@szkutI认为这是正确的答案,但我对
AddRedirect
有问题,我会在我的问题-操作过滤器的末尾为它创建一个新的主题,重写对我没有帮助。我认为在difrent场景中,重写是非常有用的,它可以取代重定向的动作过滤器。这就是为什么我将这个答案保留为A。这里是我为实现我的目标所做的事情的链接:,-下面是从问题“目标:我有一个类似的url-除其他外,过滤器的任务是将url更改为”