【发布时间】:2017-01-15 05:50:10
【问题描述】:
包含产品类别的短网址,如
http://example.com/Computers
应该在 ASP.NET MVC 4 购物车中使用。 如果没有控制器,应该调用 id 参数为 Computers 的 Home Index 方法。
我尝试将 id 参数添加到家庭控制器使用
public class HomeController : MyControllerBase
{
public ActionResult Index(string id)
{
if (!string.IsNullOrWhiteSpace(id))
{
return RedirectToAction("Browse", "Store", new
{
id = id,
});
}
return View("Index", new HomeIndexViewModel());
}
但是http://example.com/Computers 导致 404 错误
“/”应用程序中的服务器错误。
找不到资源。
描述:HTTP 404。您正在寻找的资源(或其之一 依赖项)可能已被删除,名称已更改,或者是 暂时不可用。请查看以下 URL 并制作 确保拼写正确。
请求的 URL:/计算机
版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.6.1073.0
如果http://example.com/....中斜线后没有定义控制器,如何强制调用一些控制器
使用MVC默认路由:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
看起来 MVC 忽略了路由参数:
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
如何解决这个问题?
【问题讨论】:
-
默认路由意味着 url 的第一段(在您的情况下为
Computers)将搜索名为ComputerController的控制器 -
请参阅 this answer 了解如何处理此问题的一个示例。
-
所以看起来应该创建路由约束。如何强制路由约束检查应用程序中是否存在控制器?在这种情况下,所有其他路径都可以路由到存储/浏览,而无需数据库查找。还是应该路由约束进行数据库调用以查找存在哪些类别?
-
@StephenMuecke 或者基于属性的路由可以用于此
-
属性路由不一定有帮助。你的路线需要是唯一可识别的,如果你想要一条只有一个段的路线,那么你需要一个约束,否则它也会匹配其他路线。如果参数在
Categories表中,则需要查找约束(请参阅我链接到的答案的最后一段)
标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing url-routing