Search code examples
asp.net-mvcasp.net-mvc-routing

ASP.NET MVC - get list of objects from query string


I'm passed a list of parameters. Such as "Name", "Id", "Type". There will be an many of these in url, like so:

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

I wonder if there is a way to map these query parameters to a List of objects. So, I can create an object:

MyTestObject {Name;Id;Type} and can say in my controller

Index(IList<MyTestObject> params)

params will be filled in with data from query string.

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


Solution

  • Yes, ASP.NET MVC could automatically bind collections to action params, but you need to pass your params as a from values, moreover, it is looks like to many params you going pass in query string. Have look at this one http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

    Basically what you need to do:

    1) Create your class which would contain your params

    public class MyParam 
    {
     public int Id {get; set;}
     public string Name {get; set;}
    
     //do all the rest
    }
    

    2) Create model which you would pass to your view

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

    3) Create your collection in your [HttpGet] action and pass that to your view:

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

    4) Iterate your collection in the view

    @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) Than on your [HttpPost] action you may catch your params in collection

    [HttpPost]
    public virtual ActionResult Index(MyViewModel model)
    

    or

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

    P.S

    Moreover, if you want to get all your form params in controller you may simple go like that:

    [HttpPost]    
    public virtual ActionResult Index(FormCollection form)