【问题标题】:The simplest example with MVC attribute routing doesn't work最简单的 MVC 属性路由示例不起作用
【发布时间】:2017-05-26 22:29:33
【问题描述】:

我使用 VS2013 并通过向导创建了 MVC 应用程序。我还删除了所有多余的文件并具有以下内容:

1) RouteConfig.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapMvcAttributeRoutes();
}

2) HomeController.cs

public class HomeController : Controller
{
    [Route("Home/Index")]
    public ActionResult Index()
    {
        return View();
    }
}

3) 索引.cshtml

@{
    ViewBag.Title = "Home Page";
}

Home page

我的页面有错误:

HTTP 403.14 - Forbidden

但是,如果我手动添加到浏览器地址栏中的 URL - 主页/索引:

http://localhost:50600/Home/Index

页面出现。

我做错了什么?

【问题讨论】:

  • 失败时使用什么网址
  • 我将“Home/Index”放在索引操作的路由属性中。
  • 我明白这一点。问题是什么?不清楚。
  • 我已经写过 - 当我运行应用程序时,我得到了错误的页面。

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

从路由中删除“Home”,因为控制器名称 HomeController 已经以“Home”开始您的路由。如果你想改变那个“Home”前缀,你可以给 HomeController 类添加一个属性来定义它。

此外,动作的默认路由名称将与动作名称匹配,因此在这种情况下,您可以使用 [Route("")] 并且 url /Home/Index 将起作用。

【讨论】:

  • 我不确定答案,但我认为这是因为基于属性的路由和标准路由的混合。我碰到过很多次了。如果您将所有内容完全定义为基于属性的路由,它将起作用。如果您将所有内容完全定义为标准的工作方式。当你混合这两种情况时,你会得到这样的情况,最常见的是默认路由。
  • 我删除了所有与路由表相关的旧路由样式。
【解决方案2】:

我的猜测是当你尝试这个网址时:

http://localhost:50600

它不起作用,因为您已从路由配置中删除了默认路由。不知道是不是你自己删掉的,RoutesConfig.cs文件一般自带如下默认路由:

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

此代码确保如果用户不提供控制器或操作,站点将默认为家庭控制器的索引操作(您可以在 defaults 参数下看到)。这也可以解释为什么当你尝试这条路线时它会起作用:

http://localhost:50600/Home/Index.

【讨论】:

  • 我已经返回了那个标准的代码块,但它不能正常工作。
  • 你重建项目了吗?如果是,您在项目中是否还有其他名为“HomeController”的控制器?默认路由应该是 RouteConfig 中 RegisterRoutes 方法的最后一行。
  • 不,我没有任何其他控制器。这是最简单的 MVC 应用程序。
【解决方案3】:

我想我知道你现在有什么问题了。您希望默认 url 在HomeController 中显示您的Index 视图,但您尚未设置默认路由。您可以通过在 RouteConfig.cs 中添加以下行来设置默认路由

config.Routes.MapRoute(
   name: "Default",
   routeTemplate: "{controller}/{action}",
   defaults: new { controller = "Home", action = "Index" }
);

或者,如果您希望只使用属性路由而不与路由模板混合,您可以添加默认路由,如下所示:-

config.Routes.MapRoute(
    name: "Index",
    url: "",
    defaults : new { controller = "Home", action = "Index" }
);

【讨论】:

  • 显示错误的网址是什么?我相信它与您的要求不同,因为您可以毫无问题地加载它。如果您让我们知道您如何调用错误 url 或通过 Chrome 检查器向我们显示 Web 请求,将会很有帮助。
  • @tesicg 在确定潜在问题后更新了我的答案。
  • 我不想使用旧的映射路线样式。都应该使用属性路由。
  • @tesicg 也许这回答了你的问题:stackoverflow.com/questions/24533643/…。基本上,您在网站项目的根目录中有一个名为 Home 的文件夹,它与控制器下的 Home 文件夹冲突。
  • @tesicg 然后你所需要的就是在我的第二个解决方案中指定默认路由。您仍然需要指定默认路由,因为基本上它只是将默认路由添加到 RouteTable 条目中,而没有路由引擎的所有匹配复杂性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2021-03-31
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多