Asp.net mvc ASP.NET MVC分页-将复杂类型传递回控制器?

Asp.net mvc ASP.NET MVC分页-将复杂类型传递回控制器?,asp.net-mvc,paging,Asp.net Mvc,Paging,我目前正在开发一个相当简单的MVC应用程序,它允许用户输入一些搜索数据,获得一个结果列表,然后查看每个项目等。一切都进行得相当顺利,但是我现在尝试实现分页,但遇到了一些麻烦 我的搜索表单使用HTTP GET,请求执行以下操作: public ActionResult Results(PropertySearchData data, int? page) { ... IEnumerable<Property> search = mService.SearchProper

我目前正在开发一个相当简单的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));
    ...
}
然而,当这个链接被生成时,我的链接是沿着

/Results?data=PropertySearchData&page=1
如果我完全删除“page”参数,只需将ViewData[“SearchData”]作为我的路由值传递,我的链接就会按照我的意愿生成(即PropertySearchData的每个成员都作为查询字符串通过模型绑定功能传递。我猜这是因为只有在指定了单个类型时,模型绑定才能正常工作

我可以看出这不起作用的几个原因;我遇到的问题是如何找到一种“好”的方式来做我想做的事情。我知道我在这方面肯定缺乏重要的理解,因此如果我能得到一些关于如何实现这一点的建议,我将不胜感激

请注意,我确实希望坚持使用HTTPGET(因为这是一个搜索结果页面)


谢谢!

因为
data
ViewData[“SearchData”]
PropertySearchData
的实例,我猜
Html.ActionLink
正在调用
ToString()
而没有给出您期望的结果。

因为
data
ViewData[“SearchData”]
PropertySearchData的实例中
我猜
Html.ActionLink
正在调用
ToString()
,而不是给出您期望的结果。

问题在于helper方法只是尽力从您提供的内容生成一些内容,这是一个具有两个属性的对象:数据和页面

要在中获取页码,可以使用路由值字典(这可能是在引擎盖下完成的),并使用接受IDictionary的覆盖:-

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

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

问题是helper方法只是尽最大努力从您提供的内容生成一些内容,这是一个具有两个属性的对象:数据和页面

要在中获取页码,可以使用路由值字典(这可能是在引擎盖下完成的),并使用接受IDictionary的覆盖:-

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

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

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

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

可以使用以下命令创建正确的routeValues参数:

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

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

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

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

可以使用以下命令创建正确的routeValues参数:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }
这将使用当前搜索数据初始化新的RouteValueCollection,然后使用新值添加“page”键(如果搜索数据中存在该键,则覆盖该键)