C#ASP.NET MVC:搜索的动态查询字符串

时间:2009-07-22 20:22:57

标签: c# asp.net-mvc

我有以下情况:

1)电话簿表

2)搜索表格的多种方式(名字,姓氏)

3)还有强制性的分页(页面大小和页码)以及排序

当用户首先访问该网页时,网址只是 /电话簿。现在假设用户正在搜索“abc”,然后Url变为 / Phonebook?q = abc 。然后他按名字排序升序,而网址应该变为 /电话簿?q = abc& sort = firstName& order = asc

我遇到的问题是如何编程我的视图以自动追加/修改查询字符串,使其仍包含先前输入的约束(如在我的“abc”中)查询但调整/添加新约束,例如,如果排序,然后使用分页等?

我讨厌使用JS并为此重写位置,而是让页面在我页面上的每个排序/页面/过滤器链接的每次回发后生成真正的锚点(href)。

感谢您的时间:)

2 个答案:

答案 0 :(得分:1)

使用匿名对象传递额外的参数:

<%= Html.ActionLink("Sort ascending", "Search", "PhoneBook", new {order="asc"}) %>
<!-- or -->
<%= Url.Action("Search", "PhoneBook", new {order="asc"}) %>

如果未在路线中定义额外参数,则会将它们添加为查询字符串。

答案 1 :(得分:1)

我假设你在页面上有一些控件来设置将要排序的内容,按什么顺序排列,显然是一种定义过滤内容的方法?

加载页面时,为什么不在视图中设置这些值,然后控制器应该在下次加载时正确更新?这样,用户也可以轻松更改它们,而无需触摸URL。在这种情况下,它直接将数据从控制器传递到视图并像设置任何其他控件一样设置值,例如:

<input type="text" name="search" value="<%= (string)ViewData["Search"] %>" />

如果您确实在URL中需要它,可以通过以匿名类型传递额外参数来修改按钮。

对于这样的链接:

<%= Url.Action("Search", "PhoneBook", new {order="asc"}) %>

对于表单(因为您没有专门设置提交按钮)这样的事情

<% using (Html.BeginForm(new {order="asc"}) { 

您可以通过执行类似

的操作从控制器中提取这些内容
<% using (Html.BeginForm(new { sort=(string)ViewData["Sort Order"] }))