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

时间:2011-07-18 20:45:06

标签: 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;"

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

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

Index(IList<MyTestObject> params)

params将填入查询字符串中的数据。

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

类似的内容

5 个答案:

答案 0 :(得分:4)

您可以使用值提供程序,它会将查询字符串中的值填充到单个对象中。如果您不打算创建视图模型,那么这就是您要做的。

通过以下方法将QueryString转换为FormCollection:

var GetCollection = new FormCollection( Request.QueryString );

答案 1 :(得分:3)

您可以创建一个自定义模型绑定器,它取决于Request.QueryString集合,而不是常规FormCollection

E.g:

public class MyTestObjectModelBinder : DefaultModelBinder 
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    {
        var qs = controllerContext.HttpContext.Request.QueryString;                  
        return new MyTestObject
        {
           Name = qs["Name"],
           Id = qs["Id"],
           // etc, etc
        };
    }
}

然后相应地设置[HttpGet]操作:

[HttpGet]
public ActionResult Index([ModelBinder(typeof(MyTestObjectModelBinder))]MyTestObject m) {

}

如果您愿意,也可以在全球注册,例如Application_Start()

ModelBinders.Binders.Add(typeof(MyTestObject), new MyTestObjectModelBinder());

然后你只需要你动作上的模型:

[HttpGet]
public ActionResult Index(MyTestObject m) {

}

说完所有这些后,如果你有这么多参数,就必须问这些参数来自哪里?很可能是另一页上的表单。

在这种情况下,这应该是[HttpPost]操作,使用表单集合中的参数,然后常规的MVC模型绑定将为您处理上述代码。

答案 2 :(得分:3)

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

示例:

查询param对象:

public class QueryParams
{
   public string Id,
   public string Name,
   public string Type
}
控制器方法中的

public ActionResult Index(IList<QueryParams> queryData)

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

  

的http://本地主机/ MyApp的/ [0] .ID = 123&安培; [0]请将.Name =嗒嗒&安培; [0]。键入=人&安培; [1] .ID = 345安培; [1],请将.Name =例如&安培; [1]。键入=东西

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

答案 3 :(得分:1)

是的,ASP.NET MVC可以自动将集合绑定到操作参数,但是你需要将params作为一个值传递,而且,它看起来像你要在查询字符串中传递的许多参数。看看这个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
}

2)创建您将传递给视图的模型

public class MyViewModel
{
  IList<MyParam> MyParams {get; set;}
}

3)在[HttpGet]操作中创建您的收藏集并将其传递给您的观点:

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

   return View(model);
}

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++;
} 

5)与你的[HttpPost]行动相比,你可以在集合中捕获你的参数

[HttpPost]
public virtual ActionResult Index(MyViewModel model)

[HttpPost]
public virtual ActionResult Index(IList<MyParam> model)

<强> P.S

此外,如果你想在控制器中获得所有表格参数,你可以这么简单:

[HttpPost]    
public virtual ActionResult Index(FormCollection form)

答案 4 :(得分:0)

在相关的说明中,我一直在寻找一种通过QueryString名称 - 值集合进行枚举的方法,这就是我想出的:

        var qry =HttpContext.Request.QueryString;

        if (qry.HasKeys())
        {
            foreach (var key in qry)
            {
                if(key != null)
                    var str= String.Format("Key:{0}, value:{1} ", key, qry.Get(key.ToString()));
            }
        }

此代码将为您提供QueryString中的所有名称及其值。