我知道如何创建URL友好的路由,也知道如何删除索引。但是我想知道如何将两者结合在一起吗?
使用本教程https://www.jerriepelser.com/blog/generate-seo-friendly-urls-aspnet-mvc/,我可以添加以下代码以允许进行url友好的路由。
routes.Add("ProductDetails", new SeoFriendlyRoute("drink/{id}",
new RouteValueDictionary(new { controller = "Drink", action = "Index" }),
new MvcRouteHandler()));
所以我的网址不再是test.com/index/drink/1
,而是变成了test.com/index/drink/coke
下一组代码是从URL中删除索引。
routes.MapRoute("DrinkRoute",
"drink/{id}",
new { controller = "Drink", action = "Index" });
这将成功将test.com/index/drink/1
转换为test.com/drink/1
请问如何将两者结合在一起,以便我有一条路线可以引导我执行正确的控制器操作并显示test.com/drink/coke
RouteConfig
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
答案 0 :(得分:1)
如果我对您的理解正确,那么您可以使用RouteConfig.cs
来实现预期的行为:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "DrinkRoute",
url: "drink/{id}",
defaults: new { controller = "Drink", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
在这种情况下,将使用控制器test.com/drink/coke
和操作方法DrinkController.cs
来命中URL Index
。 ID将为coke
。该控制器的源代码:
public class DrinkController : Controller
{
public ActionResult Index(string id)
{
return View();
}
}
答案 1 :(得分:1)
您还可以使用属性路由来实现相同目的,这将提供对所需路由的更多控制。
引用Attribute Routing in ASP.NET MVC 5
首先,您需要通过在routes.MapMvcAttributeRoutes();
中调用RouteConfig
来启用属性路由。确保已在基于约定的路由之前注册了它。
public class RouteConfig {
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//Attribute routes
routes.MapMvcAttributeRoutes();
//Default convention-based routes
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
启用属性路由后,您可以通过注释操作和控制器来指定路由。
[RoutePrefix("drink")]
public class DrinkController : Controller {
[HttpGet]
[Route("{name}")] // GET drink/coke
public ActionResult Index(string name) {
//...use name to get model
return View();
}
//..
}
上面的DrinkController.Index
操作现在已映射到GET drink/coke
,假设test.com
是控制器的主机,如您的示例所示。
任何未由路由属性注释的控制器或动作将默认返回到在路由表中注册的基于约定的路由(如果有)。
这意味着您可以混合使用为控制器定义的基于约定的路由和基于属性的路由。
但是请注意,一旦在控制器上使用属性路由,就必须在其所有公共操作上使用它。
答案 2 :(得分:1)
您可以删除SEO路线并赋予您的操作或控制器完全控制权:
public class DrinkssController : Controller
{
[Route("drink/{drinkName}")]
public ActionResult Index(string drinkName)
{
var model = _drinks.First(x => x.name == drinkName);
return View(model);
}
}