【问题标题】:How to use short urls for categories in MVC如何在 MVC 中为类别使用短 url
【发布时间】: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


【解决方案1】:

您的问题是因为 aspnet mvc 正在尝试查找名称为 Computers 的控制器,而您的控制器是 Home,您可以在名称为 Default 的路由之前添加这样的新路由:

routes.MapRoute(
            name: "Computers",
            url: "Computers",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

在上述情况下,您正在创建一个与 url http://domain.com/Computers 匹配的路由,该路由将由 HomeController 管理。

另外,根据您的评论,您可以有如下路线:

routes.MapRoute(
                name: "Default",
                url: "{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

【讨论】:

  • 购物车有数百个类别,这些类别在数据库中经常更改。增加数百条路线是否合理?如果在数据库中更改类别,如何删除和添加新路线?或者也许可以使用单个控制器来处理与控制器名称不匹配的所有类别?
  • 但是一件事是您的问题,另一件事是您的项目要求,我回答了您问题的可能解决方案...我更新了答案以向您展示其他方式
  • 我将 MapRoute 更改为您答案中的第二个示例。现在 http://example.com/Computers 返回 No route in the route table matches the supplied values.http://example.com 返回未找到。如何解决这个问题?
  • 只留下一条路线,本例是我回答的最新路线,我在本地测试一下
  • 我在默认路由之前添加了routes.MapRoute( name: "categories", url: "{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 。它似乎工作。在你的回答中{category} 应该改为{id}
猜你喜欢
  • 2012-03-19
  • 2013-03-28
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2011-09-04
相关资源
最近更新 更多