2011-07-18 53 views
4

我传递了一个参数列表。如“名称”,“ID”,“类型”。届时将有许多这些URL中,像这样:ASP.NET MVC - 从查询字符串获取对象列表

"Name=blah1,Id=231,Type=blah1;Name=blah2,Id=2221,Type=blah1;Name=blah3,Id=45411,Type=blah3;" 

我不知道是否有将这些查询参数映射为对象列表的方式。所以,我可以创建一个对象:

MyTestObject {名称,标识;类型},并且可以在控制器说

Index(IList<MyTestObject> params) 

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

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

+0

您是否尝试过实施该链接中建议的内容?我之前使用过,它满足了我的需求。 – Dirk

回答

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)创建CALSS,其中将包括您的PARAMS

public class MyParam 
{ 
publc 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]行动可能会引起你的PARAMS在收集

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

PS

而且如果你想在控制器中获得所有你的表单参数,你可以简单地这样做:

[HttpPost]  
public virtual ActionResult Index(FormCollection form) 
+0

http://stackoverflow.com/questions/6739211/asp-net-mvc-get-list-of-objects-from-query-string/6748667#6748667 –

4

你行你一个价值提供者,它会从查询字符串值填充到一个单一的对象。如果你不打算创建视图模型,这是你会做的。

通过变换查询字符串成的FormCollection:

var GetCollection = new FormCollection(Request.QueryString); 
+0

以及如何插入? – CRice

+0

只需将其放入控制器即可。 –

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模型绑定将为您处理上述代码。

+1

+1我也在想一个自定义模型绑定器,但也懒惰写我自己的答案。 – CRice

+1

+1这是我一直这样做的。 – Jamiec

+0

@ RPM1984我可以做以下事情吗?这似乎是一个简单的解决方案。 HTTP://计算器。com/questions/6739211/asp-net-mvc-get-list-of-objects-from-query-string/6748667#6748667 –

1

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

实施例:

查询参数对象:

public class QueryParams 
{ 
    public string Id, 
    public string Name, 
    public string Type 
} 

在控制器的方法:

public ActionResult Index(IList<QueryParams> queryData) 

然后我确保查询字符串以下列方式格式化(由索引前置) :

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

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

0

在一个相关的说明,我一直在寻找一种方式,通过查询字符串名称 - 值集合枚举,这就是我想出了:

 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中。

+0

您不能在每个语句中使用a中的str变量声明。 str变量声明应该在每个语句之前。 – miguelbgouveia

+0

并不重要。见下面的评论http://stackoverflow.com/questions/1884906/declaring-a-variable-inside-or-outside-an-foreach-loop-which-is-faster-better#comment1785311_1884957 –

+0

问题是当代码在Visual Studio 2013中编译时,如果在每个循环中声明变量,我们会得到一个编译器错误。也许有一些配置可以防止这种情况,但是默认情况下,我们会得到该编译器错误。 – miguelbgouveia