Asp.net mvc MVC:主控制器中的动态路由,不影响其他控制器

Asp.net mvc MVC:主控制器中的动态路由,不影响其他控制器,asp.net-mvc,.net-core,routes,Asp.net Mvc,.net Core,Routes,这不是关于控制器和操作如何工作的一般问题,而是关于在dotnet core MVC客户端中向用户呈现已知url结构的问题 我想用一个博客建立一个主页,也许以后用一个商店。一般的Url结构应该是 https://xxx.xx/... => Homepage content https://xxx.xx/Blog/... => Blog content https://xxx.xx/Shop/... => Shop content 博客和商店是网站中的特定区域,因此用户熟悉额外的

这不是关于控制器和操作如何工作的一般问题,而是关于在dotnet core MVC客户端中向用户呈现已知url结构的问题

我想用一个博客建立一个主页,也许以后用一个商店。一般的Url结构应该是

https://xxx.xx/... => Homepage content
https://xxx.xx/Blog/... => Blog content
https://xxx.xx/Shop/... => Shop content
博客和商店是网站中的特定区域,因此用户熟悉额外的路径,控制器和操作按预期工作

对于主页,通常您有这样的结构:

https://xxx.xx/ => Index
https://xxx.xx/privacy
https://xxx.xx/about
https://xxx.xx/company/team
你不想要的眼睛是这样的

https://xxx.xx/Home/privacy
此外,我喜欢从数据库获取这些页面,因此主控制器本身有两个条件:

如果域之后没有任何内容,请调用主控制器、Index action和Index.cshtml 如果域后面没有路径Blog/或Shop/,则它是页面的名称或slug,因此使用页面操作调用主控制器,并使用数据库中的内容显示page.cshtml。 如果我在家庭控制器中执行类似操作

[HttpGet("{slug?}")]
public async Task<IActionResult> Index(string slug)
我喜欢的那种主页可以工作,但我不能再呼叫任何其他控制器

我使用了自定义路由,但我的问题是路由显然不能区分路径和动作


我的问题有解决方案吗?或者这是我必须解决的问题吗?

尝试此路线并将其重定向到目标

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


            routes.MapRoute(
                name: "Link",
                url: "{slug}",
                defaults: new { controller = "Slug", action = "GoTo" }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
在缓动控制器中:

public async Task<ActionResult> GoTo(string ShortLink)
        {
            if (String.IsNullOrWhiteSpace(ShortLink))
                return RedirectToAction("Index", "Home");


            LinkModels linkModels = db.Links.Where(sl => sl.ShortLinkURL == ShortLink).FirstOrDefault();

            if (linkModels == null)
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ClickModels cm = new ClickModels();
                if (System.Web.HttpContext.Current.Request.UrlReferrer != null)
                {
                    linkModels.ReferralCount++;
                    cm.LinkType = 1;
                    cm.RequestURL = System.Web.HttpContext.Current.Request.UrlReferrer.AbsoluteUri;
                    cm.RequestIP = BitOneWeb.Helper.GetClientIP.GetIP();
                    cm.ClickDateTime = DateTime.Now;


                }
                else
                {
                    linkModels.DirectCount++;
                    cm.LinkType = 0;
                    //cm.RequestURL = "Direct";
                    cm.RequestIP = BitOneWeb.Helper.GetClientIP.GetIP();
                    cm.ClickDateTime = DateTime.Now;

                }
                linkModels.LinkCount = linkModels.DirectCount + linkModels.ReferralCount;
                db.Clicks.Add(cm);
                linkModels.Clicks.Add(cm);

                db.Entry(linkModels).State = EntityState.Modified;


                await db.SaveChangesAsync();
                return Redirect(linkModels.LongLinkURL);
            }
        }

这是我的工作很好,但如果你有修复控制器喜欢http://yoursite/blog 或http://yoursite/contact 您可以在slug controller中静态处理该问题

很抱歉回复太晚。我在app.UseMvcroutes下的startup.cs中添加了链接路径。。。你把它重定向到目标是什么意思?如果我有并且大约是slug,我在slug控制器的GoTo操作中,我需要重定向到哪里?你应该将slug存储在数据库中,或者在你的路径中,如果它找不到,则转到另一个路径,我将其用于短链接引擎和工作精细这正是我计划做的,但是除了slug之外,我还有正常的控制器和操作。但是对于路由器来说,博客控制器和索引操作之间没有区别。请看我的代码,它工作得很好,您可以处理静态,直接指向应用程序中修复的控制器
[HttpGet("{slug?}")]
public async Task<IActionResult> Index(string slug)