我传递了参数列表。如“名称”,“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
类似的内容答案 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中的所有名称及其值。