在我的Asp.net MVC2应用程序中,我在global.asax.cs中注册了以下路由:
routes.MapRoute(
"Search",
"Search/{action}/{category}/{query}/{page}",
new { controller = "Search", action = "Results", category = "All", page = 1 },
new { page = @"\d{1,8}" }
);
// URL: /Search
routes.MapRoute(
"SearchDefault",
"Search",
new { controller = "Search", action="Index" }
);
routes.MapRoute(
"Product",
"Product/{action}/{productcode}",
new { controller = "Product", action = "Details" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Search", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
我有我的SearchController:
public ActionResult Results(string category, string query, int page)
{
}
我有我的ProductController:
public ActionResult Details(string productcode)
{
return View();
}
在我的Results.aspx视图中,存在以下ActionLink:
<% foreach (var cat in Model.Categories) { %>
<li><%= Html.ActionLink(cat.Name, "Results", "Search", new { category= cat.Name, query = Model.SearchText, page=1 }, null)%></li>
<% } %>
</ul>
<hr />
<table>
<% foreach (var p in Model.Products) { %>
<tr>
<td>
<%= Html.ActionLink(p.ProductName, "Details", "Product", new { product = p.ProductCode }, new { })%><br />
</td>
</tr>
<% } %>
第一个actionlink呈现为:
“http://localhost/Search/Results?category=Test%20Category%20A&query=test%20product&page=1”
而第二个ActionLink正确呈现:
“http://localhost/Product/Details/1234ABC020848”
奇怪的是,即使我手动输入,两者都能正常工作:
“http://localhost/Search/Results/Test%20Category%20A/test%20product/1”
然后我的SearchController也正确执行。我真的宁愿让我的ActionLink呈现更清晰的URL。我错过了什么?
提前致谢。
答案 0 :(得分:0)
由于我没有你的模型,我确实删除了foreach循环,并用字符串替换所有未知值。在我的测试中,我发现了相反的行为:第一个链接没问题,而另一个链接不干净。第二个操作链接的修复是将“product”替换为“productcode”。
<ul>
<li><%= Html.ActionLink("Category", "Results", "Search", new { category= "Test Category A", query = "test product", page=2 }, null)%></li>
</ul>
<hr />
<table>
<tr>
<td>
<%= Html.ActionLink("Product", "Details", "Product", new { productcode = "1234ABC020848" }, new { })%><br />
</td>
</tr>
</table>
两种方式都可以起作用,因为路由系统负责映射变量。
答案 1 :(得分:0)
routes.MapRoute(
“SearchDefault”
“{控制器} / {行动} / {类别} / {查询} / {页}”,
新{},
new {controller =“Search”,action =“Results”}
);
这应该是你这样的网址(可能需要一些额外的调整)
http://localhost/Search/Results/Test%20Category%20A/test%20product/1
忽略这一点......我没有看到问题的第一条路线。
我通常喜欢使用查询字符串进行搜索,因为一旦你有两个或更多不需要的参数,那么构建和维护的路径就会很难。