2011-07-18 52 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