【发布时间】:2016-05-25 20:05:18
【问题描述】:
我正在尝试为搜索结果设置分页。
我的简化搜索视图模型如下所示:
public class SearchModel
{
public string Category { get; set; }
public List<string> Tags { get; set; }
}
Tags 属性由多选列表框设置,因此实现了集合。假设 Tags 的取值范围为 1 到 5。当用户单击“搜索”时,视图模型被传递给控制器,在控制器中它被转换为如下所示的查询字符串:
Page=1&Category=Things&Tags=1&Tags=2&Tags=3
这工作正常,搜索结果页面显示匹配值。当然,这是针对第 1 页的;必须在某处构建分页,我正在使用 Url.Action() 将这些页面链接构建到视图中。我正在尝试利用 Url.Action() 将对象转换为查询字符串。在这种情况下,我发送 Url.Action() 进行转换的对象是视图模型,唯一的变化是每个页面 URL 的 Page 属性。
但是,当我将搜索模型发送到 Url.Action() 以转换为查询字符串时,Url.Action() 会像这样输出对象:
Page=1&Category=Things&Tags=System.Collections.Generic.List%601%5BSystem.String%5D
所有属性都被正确转换除了集合。我不明白为什么控制器将对象正确转换为查询字符串,而 Url.Action() 方法却没有。请注意,使用数组和 IEnumerable 没有区别。
我正在寻找一种能够将 SearchModel 对象正确转换为查询字符串的解决方案,其中该查询字符串将与控制器生成的内容相匹配。对于 ASP.NET MVC 来说,这似乎不是一件复杂的事情,但到目前为止我没有发现任何迹象表明没有复杂的模型绑定或 JavaScript/JSON 是可能的。
非常感谢任何帮助。
【问题讨论】:
-
因为
Url.Action()在内部根据模型中每个属性的.ToString()值生成RouteValueDictionary。您不能使用Url.Action()传递包含复杂对象或集合的模型。 -
最好的猜测是您有一个带有列表框的表单,并且正在发布到一个 GET 方法,并且希望能够在分页时保留标签(和类别)的集合。如果是这样,如何添加视图和控制器方法,以便可以添加显示如何解决此问题的答案。
-
@Biohazard,你发现了吗?
标签: c# asp.net-mvc pagination