【问题标题】:ASP.NET MVC convert an object to a query string, where object has a list propertyASP.NET MVC 将对象转换为查询字符串,其中对象具有列表属性
【发布时间】: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


【解决方案1】:

像你想的那样使用 HTTP Get 请求进行分页,使用 Url.Action(),有一些方法可以做到这一点,总有一种方法,但使用 HTTP 发布请求会更直接。

使用 HTTP Post 请求解决此问题,将当前页面存储在您的 .cshtml 视图中作为表单 action="/mycontroller/myaction" HTML 的子项。

这是一个简单的教程:

http://www.codeguru.com/csharp/.net/net_asp/mvc/implementing-sorting-and-paging-in-asp.net-mvc.html

了解了这种方式后,就可以开始学习如何使用 Ajax 进行分页了,所以最终不会像上面教程那样刷新页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2018-05-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多