ASP.NET MVC - 从查询字符串中获取对象列表

dev*_*per 5 asp.net-mvc asp.net-mvc-routing

我传递了一个参数列表。如“名称”、“ID”、“类型”。url 中会有很多这样的内容,如下所示:

"Name=blah1,Id=231,Type=blah1;Name=blah2,Id=2221,Type=blah1;Name=blah3,Id=45411,Type=blah3;"
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法将这些查询参数映射到对象列表。所以,我可以创建一个对象:

MyTestObject {Name;Id;Type} 并且可以在我的控制器中说

Index(IList<MyTestObject> params)
Run Code Online (Sandbox Code Playgroud)

params 将填充来自查询字符串的数据。

类似于http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx 的东西

dev*_*per 5

我实际上遵循了Haack 先生文章中的建议, 我创建了一个类,其中所有参数都作为公共属性。然后我有一个视图,获取该类型对象的列表。如果查询参数名称遵循某种模式(以索引为前缀),那么我会自动填充一个我的对象列表,我根本不需要进行任何手动解析。这对我来说是最简单的解决方案。

例子:

查询参数对象:

public class QueryParams
{
   public string Id,
   public string Name,
   public string Type
}
Run Code Online (Sandbox Code Playgroud)

在控制器方法中:

public ActionResult Index(IList<QueryParams> queryData)
Run Code Online (Sandbox Code Playgroud)

然后我确保查询字符串按以下方式格式化(以索引开头):

http://localhost/myapp/?[0].id=123&[0].Name=blah&[0].Type=Person&[1].Id=345&[1].Name=example&[1].Type=东西

在我的控制器中,queryData 列表参数将包含两个填充了正确数据的对象。


Kun*_*vič 1

是的,ASP.NET MVC 可以自动将集合绑定到操作参数,但是您需要将参数作为 from 值传递,而且,您似乎要在查询字符串中传递许多参数。看看这个http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

基本上你需要做什么:

1)创建包含参数的类

public class MyParam 
{
 public int Id {get; set;}
 public string Name {get; set;}

 //do all the rest
}
Run Code Online (Sandbox Code Playgroud)

2)创建模型并将其传递到视图

public class MyViewModel
{
  IList<MyParam> MyParams {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

3)在您的操作中创建您的集合[HttpGet]并将其传递到您的视图:

[HttpGet]
public virtual ActionResult Index()
{
   MyViewModel model = new MyViewModel();
   model.MyParams = CreateMyParamsCollection();

   return View(model);
}
Run Code Online (Sandbox Code Playgroud)

4) 在视图中迭代你的集合

@model MyViewModel

@{int index = 0;}

@foreach (MyParam detail in Model.MyParams)
{
  @Html.TextBox("MyParams[" + index.ToString() + "].Id", detail.Id)
  @Html.TextBox("MyParams[" + index.ToString() + "].Name", detail.Name)

  index++;
} 
Run Code Online (Sandbox Code Playgroud)

5)比你的[HttpPost]行动你可能会在集合中捕获你的参数

[HttpPost]
public virtual ActionResult Index(MyViewModel model)
Run Code Online (Sandbox Code Playgroud)

或者

[HttpPost]
public virtual ActionResult Index(IList<MyParam> model)
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

此外,如果您想在控制器中获取所有表单参数,您可以简单地这样做:

[HttpPost]    
public virtual ActionResult Index(FormCollection form)
Run Code Online (Sandbox Code Playgroud)