ASP.NET MVC 路由无法正常工作

12

我的路由不正常。我已经定义了以下路由:

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")

Category控制器的我的详细操作方法:

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

     return View(model);
}

我的路由配置有什么问题?

4个回答

35

将您的路由从最具体到最不具体重新排序。这样,联系和关于页面的路由会出现在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的URL将始终由seoName路线处理。重新排序它们,以确保它们由HomeController中的适当动作处理,且只有在联系人和关于路由未能匹配时,seoName路由才会匹配URL。


3

首先定义了 CategoryDetails 路由,因此它匹配例如 "http://server/AboutUs" 这样的 URL(seoName 将被赋值为 "AboutUs")。最具体的路由(如 AboutUs、ContactUs)应该首先进行定义。


1
以下内容导致了问题,请将其注释掉或放在底部。
routes.MapRoute(
     name: "CategoryDetails",
     url: "{seoName}",
     defaults: new { controller = "Category", action = "Details" }
);

最初默认路由有效,并且您将进入HomeControllers Indeax操作。

当您单击任何链接时,路由引擎会匹配第一个链接。使用路由定义中指定的默认值。

尝试在控制器和视图中添加以下行,以便了解您出错的位置和原因。

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

在视图中

<h1>@ViewBag.ValueReceived</h1>

当点击“联系我们”或“详情”时,URL 将类似于:

http://arunkumar.com:62115/about

这里将“about”视为seoName的值,并选择了错误的路由。

很好的解释如何调试并得出正确的结论,以及OP所寻找的答案。 - Madeline Trotter

0
我遇到了类似的错误,我把
HttpPost("/route")
写成了
HttpPost("route")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接