我想要干净的网址并定义了两条路线:
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()
调用失败:
路线表中没有路线与提供的值匹配。
我似乎无法找到它无效的原因。
答案 0 :(得分:2)
从第二条路线的默认值中删除content
,query
和index
,解决了问题。为什么我无法真正告诉,因为那些只是定义默认值,当它们没有提供时,在我的情况下不是这种情况。无论如何,我正在提供这些价值观。
答案 1 :(得分:2)
我遇到了同样的问题,谢天谢地,这帮助了我,所以我想回馈一些东西。
似乎MVC 2框架发生了变化,迫使您以不同的方式声明路线。
为了获得额外的路由值(例如内容),你不能指定默认的string.Empty,而是要
content = UrlParameter.Optional
然后,这应该允许您的路由评估行为与在MVC 1中的行为相同。