如何在MVC控制器中访问Javascript多维数组
我必须传递这样的filter数组:
脚本代码:
return { CustomFilter: options.filter.filters };
++++++++++++++++++++++++++++++++++++++++++++++++
来自Firebug:
CustomFilter[0][field] ItemName CustomFilter[0][operator] startswith CustomFilter[0][value] testing Value CustomFilter[1][field] BrandName CustomFilter[1][operator] startswith CustomFilter[1][value] testing Value 1
发布的值是:
但是我无法在Controller端收到这些。
我试过这样的:
public ActionResult ReadOperation( string[][] CustomFilter)
也像这样:
public ActionResult ReadOperation( Filter[] CustomFilter) public class Filter { public string field { get; set; } public string @operator { get; set; } public string value { get; set; } }
但没有奏效。 请建议。
谢谢。
使用Json反序列化找到解决方案
脚本代码更改为:
return { CustomFilter: JSON.stringify(CustomFilter) };
控制器代码更改为:
using Newtonsoft.Json; public ActionResult ReadOperation(MyViewModel model) { var filters = JsonConvert.DeserializeObject(model.CustomFilter, typeof(CustomFilter[])); } public class MyViewModel { public string Filter { get; set; } public string group { get; set; } public int page { get; set; } public int pageSize { get; set; } public int sort { get; set; } } public class CustomFilter { public string field { get; set; } public string @operator { get; set; } public string value { get; set; } }
控制器中的结果视图:
如果您使用的是ASP.NET MVC 4,并且无法更改参数名称,则可以通过以下方式定义自定义模型:
public class MyViewModel { public Dictionary[] CustomerFilter { get; set; } public string filter { get; set; } public string group { get; set; } public int page { get; set; } public int pageSize { get; set; } public int sort { get; set; } }
然后,在控制器:
public ActionResult ReadOperation(MyViewModel model){ ... }
似乎网格生成的参数中使用的符号用于字典 。 但是,没有尝试过字典集合。
它看起来像模型结构的错误。
public class MyViewModel { public Filter[] CustomFilter { get; set; } public string Filter { get; set; } public string Group { get; set; } public int Page { get; set; } public int PageSize { get; set; } public int Sort { get; set; } }
尝试将此类型用于模型绑定。
public ActionResult ReadOperation(MyViewModel model)
在post中,尝试按以下方式发送数据:
CustomFilter[0].Field ItemName CustomFilter[0].Operator startswith CustomFilter[0].Value testing Value CustomFilter[1].Field BrandName CustomFilter[1].Operator startswith CustomFilter[1].Value testing Value 1
在控制器:
public ActionResult ReadOperation(Filter[] CustomFilter)
将Filter
类定义为:
public class Filter { public string Field { set; get; } public string Operator { set; get; } public string Value { set; get; } }
(小心大写字母)。
或者如果你想使用模型方法,正如Ufuk建议的那样,并且具有相同的Filter
类:
-
模型:
public class MyViewModel { public Filter[] CustomerFilter { get; set; } public string Filter { get; set; } public string Group { get; set; } public int Page { get; set; } public int PageSize { get; set; } public int Sort { get; set; } }
-
POST中的参数:
CustomFilter[0].Field ItemName CustomFilter[0].Operator startswith CustomFilter[0].Value testing Value CustomFilter[1].Field BrandName CustomFilter[1].Operator startswith CustomFilter[1].Value testing Value 1 Filter ItemName~startswith~'12'~and~BrandName~startswith~'123' Group Page 1 PageSize 15 Sort
-
调节器
public ActionResult ReadOperation(MyViewModel model)
请看这个链接: http : //haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/