高级MVC.NET路由

时间:2014-09-03 14:33:51

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

我目前正试图以下列方式进行路线。

  • / 路由到家庭控制器,查看操作," home"作为id
  • / somePageId 路由到家庭控制器,查看操作," somePageId"作为id
  • /视频路由到视频控制器,索引操作
  • / Videos / someVideoName 路由到视频控制器,带有id参数的视频操作为" someVideoName"
  • / 新闻路由到新闻控制器,索引操作
  • / News / someNewsId 路由到新闻控制器,查看操作," someNewsId"作为身份。

到目前为止,我有以下代码:

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

routes.MapRoute(
    name: "NewsIndex",
    url: "News",
    defaults: new { controller = "News", action = "Index" },
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" }
);

routes.MapRoute(
    name: "NewsView",
    url: "News/{id}",
    defaults: new { controller = "News", action = "_", id = UrlParameter.Optional },
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" }
);

routes.MapRoute(
    name: "PageShortCut",
    url: "{id}",
    defaults: new { controller = "Home", action = "_", id = UrlParameter.Optional },
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" }
);

如果我去/ Home / _ / About,我可以查看该页面,如果我去/关于,我只需要404.

这可能在mvc.net中吗?如果是这样,我将如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

尝试从UrlParameter.Optional路线中删除PageShortCut。您也可能需要重新排序路线。

这对我有用(作为最后两条路线):

routes.MapRoute(
    name: "PageShortCut",
    url: "{id}",
    defaults: new { controller = "Home", action = "_" },
    namespaces: new[] { "TheSportsOfficeWeb.Controllers" }
);

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

我的控制员:

public class HomeController : Controller {
    public string Index(string id) {
        return "Index " + id;
    }

    public string _(string id) {
        return id;
    }
}

当您告知路由引擎id不是路由的可选项时,除非id存在,否则它不会使用该路由。这意味着对于没有任何参数的网址,引擎将落入Default路由。