【问题标题】:How to set a default route in asp.net C# for certain controller action?如何在 asp.net C# 中为某些控制器操作设置默认路由?
【发布时间】:2021-06-01 10:39:35
【问题描述】:

我怎样才能限制某些路线不被使用。

在我的 startup.cs 中有两个 mapendpoint

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "botConfiguration",
                    pattern: "bot/{botID}/{controller=Home}/{action=Index}/{id?}"); 

                endpoints.MapControllerRoute(
                     name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });

在我的控制器中

        public IActionResult Setting(int botID)
        {

            //botConfigRepository.GetAll();
            return View();
        }

我想说的是,如果我的路由中没有定义 botID,那么你就不能调用这个动作,否则它会重定向到某种主页。

现在我知道我可以做一个

if (botID == 0 ){
   return RedirectToAction("Index");
}

某种意义上,但是为每个动作都写这个听起来有点痛苦。

【问题讨论】:

  • 你试过用ActionFilter吗?
  • 不,我没有尝试这个动作过滤器,我得研究一下

标签: c# asp.net-core routes


【解决方案1】:

当然,ASP.NET Core 支持多种实现横切关注点的方式。取决于你想要多粗暴,但它可以像添加自定义中间件委托一样简单,如下所示:

// In Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Placed before app.UseEndpoints()
    app.Use(async (ctx, next) => {
        if (!ctx.Request.Query.ContainsKey("botID") && !ctx.Request.Path.Value.Contains("Index"))
            ctx.Response.Redirect("Index");
        else
            await next();
    });
}

(第二个条件只是为了防止级联重定向。)

中间件基本上是请求处理管道的最顶层组成部分,它本质上是一个责任链结构,每个中间件都可以通过控制或短路。 ASP.NET 自己的组件被实现为中间件,例如授权中间件和路由中间件。这些在Startup.cs/Configure() 中添加的顺序决定了它们的执行顺序。

因此,如果您想实现相对较低级别的目标,最简洁的方法通常是使用中间件。您还可以使用app.UseMiddleware() 添加正确的middleware class

(您应该注意的一件事是中间件具有单例生命周期,因此将请求范围的服务注入其中是有问题的。请参阅this question。)

作为替代解决方案,您可以使用全局注册的ActionFilter 来实现相同的结果,正如有人评论的那样:

public class MyActionFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context) {}

    public void OnActionExecuting(ActionExecutingContext ctx)
    {
        if (!ctx.HttpContext.Request.Query.ContainsKey("botID") && !ctx.HttpContext.Request.Path.Value.Contains("Index"))
        {
            ctx.Result = new RedirectResult("Index");
        }
    }
}

// Register it in Startup.ConfigureServices()
services.AddMvc(options => options.Filters.Add(new MyActionFilter()));

如果您有其他要求,请随时发表评论,我可以尝试解决。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 2019-11-02
    • 2011-09-22
    • 2013-10-04
    • 1970-01-01
    • 2016-07-03
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多