MVC2 - 路由映射但呈现QueryString

时间:2010-08-06 11:45:57

标签: asp.net-mvc-2 asp.net-mvc-routing

在我的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。我错过了什么?

提前致谢。

2 个答案:

答案 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

忽略这一点......我没有看到问题的第一条路线。

我通常喜欢使用查询字符串进行搜索,因为一旦你有两个或更多不需要的参数,那么构建和维护的路径就会很难。

相关问题