路线没有得到解决

时间:2010-02-09 11:54:29

标签: asp.net-mvc routing redirecttoaction

我想要干净的网址并定义了两条路线:

routes.MapRoute(
    "Search",
    "Search",
    new { controller = "Search", action = "SearchPanel" }
);
routes.MapRoute(
    "SearchResults",
    "Search/{content}",
    new { controller = "Search", action = "Search", content = string.Empty, query = string.Empty, index = 0 }
);

然后我有两个动作:

[HttpPost]
public ActionResult Search(string content, string query)
{
    if (string.IsNullOrEmpty(query))
    {
        return RedirectToAction("Home", "Application");
    }
    return RedirectToAction("Search", new { content = content, query = query }); ;
}

public ActionResult Search(string content, string query, int? index)
{
    if (string.IsNullOrEmpty(query))
    {
        return RedirectToAction("Home", "Application");
    }

    switch (content)
    {
        case "products":
            // get products
            return View("ResultsProducts");
        case "categories":
            // get categories
            return View("ResultsCategories");
        default:
            // get all
            return View("ResultsAll");
    }
}

我的母版页中有一个通用搜索面板,它有一个文本框和一个提交按钮。它发布到/Search。文本框的名称为query。一切都很好。当我点击Search时,我的第一个操作会被执行,但RedirectToAction()调用失败:

路线表中没有路线与提供的值匹配。

我似乎无法找到它无效的原因。

2 个答案:

答案 0 :(得分:2)

从第二条路线的默认值中删除contentqueryindex,解决了问题。为什么我无法真正告诉,因为那些只是定义默认值,当它们没有提供时,在我的情况下不是这种情况。无论如何,我正在提供这些价值观。

答案 1 :(得分:2)

我遇到了同样的问题,谢天谢地,这帮助了我,所以我想回馈一些东西。

似乎MVC 2框架发生了变化,迫使您以不同的方式声明路线。

为了获得额外的路由值(例如内容),你不能指定默认的string.Empty,而是要

content = UrlParameter.Optional

然后,这应该允许您的路由评估行为与在MVC 1中的行为相同。