Asp.net mvc MVC:主控制器中的动态路由,不影响其他控制器
这不是关于控制器和操作如何工作的一般问题,而是关于在dotnet core MVC客户端中向用户呈现已知url结构的问题 我想用一个博客建立一个主页,也许以后用一个商店。一般的Url结构应该是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 博客和商店是网站中的特定区域,因此用户熟悉额外的
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)