1

我目前正在开发一个相当简单的 MVC 应用程序,它允许用户输入一些搜索数据,获取结果列表,然后查看每个项目等。一切进展顺利,但是我现在正在尝试实现分页但是有一些麻烦。

我的搜索表单使用 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(因为这是一个搜索结果页面)。

谢谢!

4

3 回答 3

2

因为dataorViewData["SearchData"]PropertySearchData我猜测的实例,它Html.ActionLink正在调用ToString()它并且没有给出您期望的结果。

于 2009-05-05T23:48:22.970 回答
2

问题是辅助方法只是尽力从你给它的东西中生成一些东西,这是一个具有两个属性的对象:数据和页面。

要获取页码,您可以使用路由值字典(这可能是在后台完成的操作)并使用接受 IDictionary 的覆盖:-

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

return Html.ActionLink("First", "Results", searchCriteria)
于 2009-05-06T00:01:39.630 回答
1

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

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

您可以使用以下内容创建正确的 routeValues 参数:

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

这将使用当前搜索数据初始化一个新的 RouteValueCollection,然后使用新值添加“页面”键(如果它存在于搜索数据中,则覆盖)。

于 2009-05-25T23:13:30.133 回答