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/blog
或 http://yoursite/contact
这样的修复控制器,你可以在 slug 控制器中静态处理它
【讨论】:
抱歉回复晚了。我在 app.UseMvc(routes... Slug-Controller 中的 GoTo-Action,我需要重定向到哪里? 如果没有找到其他路线,您应该将 slug 存储在数据库或您的路线中,我将它用于短链接引擎并且工作正常 这正是我打算做的,但除了“蛞蝓”之外,我还有普通的控制器和动作。但是对于路由器,website.com/slug 和 website.com/Blog 没有区别,即 Blog-Controller 和 Index-Action。 查看我的代码,它工作正常,您可以处理静态以定向到在您的应用中修复的控制器以上是关于MVC:Home-Controller 中的动态路由,不影响其他控制器的主要内容,如果未能解决你的问题,请参考以下文章