2014-01-27 126 views
4

我的路由工作不正常。我有以下途径定义:ASP.NET MVC路由不工作

routes.MapRoute(
    name: "CategoryDetails", 
    url: "{seoName}", 
    defaults: new { controller = "Category", action = "Details" } 
); 

routes.MapRoute(
    name: "ContactUs", 
    url: "contact", 
    defaults: new { controller = "Home", action = "Contact" } 
); 

routes.MapRoute(
    name: "AboutUs", 
    url: "about", 
    defaults: new { controller = "Home", action = "About" } 
); 

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

当我点击了有关我们或联系我们友情链接然后它需要我在类别控制器的细节操作方法。

这是标记为我的关于我们和联系我们友情链接:为类别控制器

@Html.ActionLink("About", "About", "Home") 
@Html.ActionLink("Contact", "Contact", "Home") 

我的详细信息操作方法:

public ActionResult Details(string seoName) 
{ 
    CategoryViewModel model = categoryTask.Details(seoName); 

    return View(model); 
} 

什么是错我的路由配置?

回答

25

从最具体到不太具体的路线重新排序。这样的接触和了解的路由将在seoName路线未到以前

routes.MapRoute(
     name: "ContactUs", 
     url: "contact", 
     defaults: new { controller = "Home", action = "Contact" } 
); 

routes.MapRoute(
     name: "AboutUs", 
     url: "about", 
     defaults: new { controller = "Home", action = "About" } 
); 

routes.MapRoute(
     name: "CategoryDetails", 
     url: "{seoName}", 
     defaults: new { controller = "Category", action = "Details" } 
); 

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

与原有秩序,网址~/contact~/about总是由seoName途径来处理。通过对它们进行重新排序,您可以确保它们在HomeController中的正确操作中处理,并且seoName路由只会在联系和路由匹配失败后匹配一个网址。

+0

感谢了很多人! =) –

+2

我不知道路由顺序,这个答案节省了我的一天! +1 –

3

首先定义CategoryDe​​tails路径。这就是为什么它匹配例如url“http://server/AboutUs”(seoName将被分配“AboutUs”)。应该首先定义最具体的路线(AboutUs,ContactUs)。

1

以下是您的问题。请评论或放置在底部。

routes.MapRoute(
    name: "CategoryDetails", 
    url: "{seoName}", 
    defaults: new { controller = "Category", action = "Details" } 
); 

最初的Defual路线的工作原理和你采取HomeControllers Indeax行动。

当您点击任何链接。路由引擎匹配第一个。将采用路由定义中指定的默认值。

尝试在控制器和视图中添加以下行。这样你就会了解并你走错了

public ActionResult Details(string seoName) 
    { 
     ViewBag.ValueReceived = seoName; 
     return View(); 
    } 

,并考虑

<h1>@ViewBag.ValueReceived</h1> 

当点击联系或详细信息的URL将被类似

http://arunkumar.com:62115/about

这里'about'被认为是seoName的值,并且选择了错误的路由

+0

对于如何调试并得出正确结论以及OP寻找答案的良好解释。 –

0

我有一个类似的错误,我把

HttpPost("/route")
代替

HttpPost("route")