2009-05-05 91 views
1

我目前正在研究一个合理简单的MVC应用程序,它允许用户输入一些搜索数据,获得结果列表,然后查看每个项目等等。这一切都很顺利,但我现在试图实现分页但有一些麻烦。ASP.NET MVC Paging - 将复杂类型传递回控制器?

我的搜索表单使用HTTP GET,请求了以下行动:

public ActionResult Results(PropertySearchData data, int? page) 
{ 
    ... 
    IEnumerable<Property> search = mService.SearchProperties(data); 

    ViewData["SearchData"] = data; 
    return View("Results", "Site", search.ToPagedList(page ?? 0, 20)); 
    ... 
} 

在这里,我建我的成绩表从传递到我看来,IEnumerable集合。另外,我使用ViewData来保存搜索参数,以便在用户请求其他页面时传递它们。

例如,去的第一页,我想用这样的:

Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 }) 

然而,产生这个链接的时候,我的链接是沿

/Results?data=PropertySearchData&page=1 
线

如果我完全删除'page'参数,并传递ViewData [“SearchData”]作为我的路由值,我的链接就会生成我想要的(即PropertySearchData的每个成员都作为查询字符串传递模型绑定功能,我猜这是因为模型绑定只能在正确的时候工作你已经指定了一种类型?

我可以看到几个原因,为什么这不起作用;我遇到的麻烦是制定出“我很好”的方式去做我想做的事情。我知道我必须在这里缺乏重要的理解,所以如果我能够得到关于如何解决这个问题的一些指示,我们将不胜感激。

请注意,我真的想坚持HTTP GET(因为这是一个搜索结果页面)。

谢谢!

回答

2

问题是帮助器方法只是尝试最好从给出的东西中产生一些东西,这是一个具有两个属性的对象:数据和页面。

获得页面数,你可以使用路由值字典的(这可能是什么引擎盖下做反正),并利用覆盖的接受一个I​​Dictionary: -

//In some HtmlHelper extension method or something 
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]); 
searchCriteria.Add("page", 1); 

return Html.ActionLink("First", "Results", searchCriteria) 
+0

啊,这很好,整洁,谢谢! – CapBBeard 2009-05-06 00:41:53

2

由于dataViewData["SearchData"]是在PropertySearchData我猜Html.ActionLink呼吁它ToString(),而不是让你所期望的结果实例。

1

创建HtmlHelper扩展方法不是解决此问题的最佳方法。它不会增加一般功能,只会增加(视觉)混乱...

Html.ActionLink的routeValues重载需要一个对象或RouteValueCollection(IDictionary)。您现在正在使用对象重载(因为新的{}构造函数是一个匿名对象)。

你可以使用以下方法来创建正确的routeValues参数:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } } 

这初始化与当前的搜索数据的新RouteValueCollection,然后添加新值“页”键(如果存在覆盖在搜索数据中)。

相关问题