MVC:Home-Controller 中的动态路由,不影响其他控制器

Posted

技术标签:

【中文标题】MVC:Home-Controller 中的动态路由,不影响其他控制器【英文标题】:MVC: Dynamic routes in Home-Controller without affecting other controllers 【发布时间】:2019-05-11 16:15:02 【问题描述】:

这不是关于控制器和操作如何工作的一般问题,而是关于在 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

另外我喜欢从数据库中获取这些“页面”,这样Home控制器本身就有两个条件:

    如果域之后没有任何内容,请调用 Home 控制器、Index 操作和 Index.cshtml 如果域后面的某些内容没有路径“Blog/”或“Shop/”,则它是页面的名称或 slug,因此使用“页面操作”调用 Home 控制器并显示页面。包含数据库内容的 cshtml。

如果我在 Home 控制器中做这样的事情

[HttpGet("slug?")]
public async Task<IActionResult> Index(string slug)

我喜欢主页工作的那种,但我不能再调用任何其他控制器了。

我玩过自定义路由,但我的问题是路由显然无法区分“路径”和“动作”。

我的问题是否有解决方案,或者这是我必须处理的事情?

【问题讨论】:

【参考方案1】:

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

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 
            );
        

在 slug 控制器中:

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/bloghttp://yoursite/contact 这样的修复控制器,你可以在 slug 控制器中静态处理它

【讨论】:

抱歉回复晚了。我在 app.UseMvc(routes... Slug-Controller 中的 GoTo-Action,我需要重定向到哪里? 如果没有找到其他路线,您应该将 slug 存储在数据库或您的路线中,我将它用于短链接引擎并且工作正常 这正是我打算做的,但除了“蛞蝓”之外,我还有普通的控制器和动作。但是对于路由器,website.com/slug 和 website.com/Blog 没有区别,即 Blog-Controller 和 Index-Action。 查看我的代码,它工作正常,您可以处理静态以定向到在您的应用中修复的控制器

以上是关于MVC:Home-Controller 中的动态路由,不影响其他控制器的主要内容,如果未能解决你的问题,请参考以下文章

即时通讯开发之详解TCP/IP中的IP选路动态选路

即时通讯开发之详解TCP/IP中的IP选路动态选路

如何在 Spring MVC 中的不同类中创建动态 bean

IIS 将 MVC 中的静态文件理解为动态内容

ASP.NET MVC 中的动态路由操作名称

MVC - 将动态添加的控件绑定到模型中的 List<T>