我想创建简单的博客引擎。对于花哨而干净的url,我想使用在MVC4中实现的路由机制。
我添加到 RouteConfig.cs 这一行:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "ArticleList",
url: "Articles/{category}/{page}",
defaults: new
{
controller = "Articles",
category = UrlParameter.Optional,
page = 1
});
}
}
如果我在网页浏览器中写道:
http://localhost:6666/Articles/SomeCategory/3
我想转移到这个控制器:
public class ArticlesController : ControllerBase<IHomeService>
{
public ActionResult Index(string category, int page = 0)
{
return View("~/Views/Article/Articles.cshtml");
}
}
参数category =“SomeCategory”和page = 1。
我收到的只是 '/'应用程序中的服务器错误。 无法找到资源。
有什么问题?
答案 0 :(得分:5)
routes.MapRoute(
name: "ArticleList",
url: "{controller}/{category}/{page}",
defaults: new
{
category = UrlParameter.Optional,
page = 1,
action = "Index"
},
constraints: new
{
controller = "Articles"
}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
修改强>
我应该把这个添加到答案中,但我很着急:
在上面的示例中,使用约束或硬编码路由会产生相同的结果。约束更灵活,因为您可以使用正则表达式来限制路由所针对的控制器/操作/参数值。例如,如果添加使用/ category / page模式的新路由,则可以相应地修改控制器约束:
约束:新的 { controller = @“^(文章| AnotherController)$” }
答案 1 :(得分:0)
问题是,您在{controller} / {category} / {page}路径中间有一个可选参数。 ASP.NET路由有问题,因为如果没有提供类别,则无法检测到未提供该类别。在路径here的中间有一个可选参数的解决方案。它解决了一个更普遍的问题,但它也涵盖了你的问题。
答案 2 :(得分:0)
要启用属性路由,请在配置期间调用MapMvcAttributeRoutes。以下是代码剪辑。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
}
在MVC5中,我们可以将属性路由与基于约定的路由相结合。以下是代码剪辑。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
通过向路由参数添加问号,可以非常轻松地将URI参数设置为可选。我们还可以使用form parameter = value指定默认值。 here是完整的文章。