2009-07-22 25 views
1

我有以下情形:C#ASP.NET MVC:动态查询字符串搜索

1)电话号码簿表

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

3)还有强制性寻呼(页面大小和页号)以及排序

当用户访问该页面的第一URL是简单地/电话簿。现在,假设用户正在搜索“abc”,那么网址将变为/电话簿?q = abc。然后他按照名字排序,并且URL应该变成/电话簿?q = abc & sort = firstName & order = asc

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

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

欣赏你的时间乡亲:)

+0

更新了一些例子给你 – 2009-07-22 21:05:16

回答

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"] })) 
+0

你可以添加一个例子请问?谢谢 :) – Alex 2009-07-22 20:28:53

1

只是通过与一个匿名对象额外的参数:

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

如果额外参数没有在路由中定义,它们将作为查询字符串。