【问题标题】:Trying to setup root homepage using routing尝试使用路由设置根主页
【发布时间】:2015-09-18 10:12:46
【问题描述】:

我正在尝试使用路由模块将我的域 http://www.example.com/ 的根路径设置为 PersonSearch 控制器,但它似乎没有任何效果(404 错误)。

URL http://www.example.com/person/search 正确地将我带到所需的页面。

RouteConfig.cs

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

    routes.MapMvcAttributeRoutes();

    routes.MapRoute(
      "Root",
      "",
      defaults: new { controller = "Person", action = "Search" }
    );
  }
}

PersonController.cs

public class PesonController : Controller
{
    [HttpGet]
    [Route("person/search")]
    public ActionResult Search()
    {
        PersonSearchViewModel psvm = new PersonSearchViewModel();
        return View(psvm);
    }
}

【问题讨论】:

  • 切换路由配置怎么样?在基于属性的路由之前设置 Root routemap。
  • 你的意思是改变代码中的顺序?移动 routes.MapMvcAttributeRoutes();在 MapRoute() 调用之后?
  • 是的。并且也按照 Murilo 的建议去做,MVC 有必要理解 URL 的构造。

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


【解决方案1】:

我认为您的路由中缺少 url 参数

routes.MapRoute(
      "Root",
      url: "{controller}/{action}",
      defaults: new { controller = "Person", action = "Search" }
    );

【讨论】:

  • 我要配置的 URL 是根,因此我将该行留空。
【解决方案2】:

这是一个排序问题。如果您将 URL 定义为空字符串 (root),则该路由应放置在所有其他路由之前

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

        routes.MapRoute(
          "Root",
          "",
          defaults: new { controller = "Person", action = "Search" }
        );

        routes.MapMvcAttributeRoutes();

        // Place any other `MapRoute` declarations here
    }
}

【讨论】:

  • 如果我注释掉 routes.MapMvcAttributeRoutes();但是一旦我将该行添加回来,我就会收到根 (/) 的 404 错误
  • 如果在 Person/Search 上评论 route 属性会发生什么?如果这没有帮助,您可以尝试分而治之的方法 - 注释属性路由组,直到找到您要查找的组所属的组(当 404 消失时),然后一次取消注释它们直到找到罪魁祸首。
  • 你有没有按照我的建议颠倒顺序并把MapRoute放在第一位?
  • 是的,我把MapRoute()放在第一位,MapMvcAttributeRoutes()放在第二位,这导致MapMvcAttributeRoutes()似乎覆盖了MapRoute()。我可以让主页正常工作的唯一方法是完全删除 MapMvcAttributeRoutes()
【解决方案3】:

我发现我可以通过一段简单的属性路由代码来实现我想要的。

public class PesonController : Controller
{
    [HttpGet]
    [Route("~/")]
    [Route("person/search")]
    public ActionResult Search()
    {
        PersonSearchViewModel psvm = new PersonSearchViewModel();
        return View(psvm);
    }
}

然后我可以在RouteConfig 中删除对routes.MapRoute() 的调用

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多