2011-07-18 12 views
4

パラメータリストを渡しました。 "Name"、 "Id"、 "Type"などのように。オブジェクトのリストにこれらのクエリパラメータをマッピングする方法があるかどうASP.NET MVC - クエリ文字列からオブジェクトのリストを取得します。

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

私は疑問に思う:そうのように、URLにこれらの多くがあるでしょう。そして

Index(IList<MyTestObject> params) 

のparamsはクエリ文字列からのデータで満たされるでしょう私のコントローラに言うことができる

MyTestObject {; IDタイプ名}:だから、私は、オブジェクトを作成することができます。

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

+0

あなたはそのリンクで提案されたことを実装しようとしましたか?私は前にそれを使用して、それは私のニーズを満たした。 – Dirk

答えて

1

はいASP.NET MVCは、アクションのparamsに自動的にバインドコレクションを可能性がありますが、値からとしてあなたのparamsを渡す必要がありますクエリ文字列に渡す多くのパラメータ。基本的にはあなたが何をする必要があるか、この1 http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

を見てください:

1)

public class MyParam 
{ 
publc int Id {get; set;} 
public string Name {get; set;} 

//do all the rest 
} 

2あなたのparamsを含んでいるでしょう、あなたのcalssを作成します)、あなたのビュー

に渡すモデルを作成します。
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)あなたは、コレクションであなたのparamsを

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

PS

またキャッチしてあなたの[HttpPost]アクションよりも、ビュー

@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]  
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

あなたはあなたにできる値プロバイダーに似ている何か、そしてそれが1つのオブジェクトにクエリ文字列から値を移入します。これは、ビューモデルを作成しない場合に実行します。経由

FormCollectionへのQueryStringを変換:しかもそれはへのように見えますが、

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

とはどのように接続されますか? – CRice

+0

コントローラにドロップするだけです。 –

3

あなたではなく、通常のFormCollectionよりも、Request.QueryStringコレクションをオフに働くカスタムモデルバインダーを作成することができます。

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:// stackoverflow。com/questions/6739211/asp-net-mvc-query-string-from-query-string/6748667#6748667 –

1

実際に助言を受けたのはarticle by Mr. Haackです。パブリックプロパティとしてすべてのパラメータを持つクラスを作成しました。次に、そのタイプのオブジェクトのリストを表示するビューを用意しました。クエリのパラメータ名が特定のパターン(インデックスが前に付いています)に従うと、オブジェクトが自動的に入力されたリストが表示され、手動で解析する必要はありません。これは私にとって最も簡単な解決策です。

例:

クエリのparamオブジェクト:コントローラメソッドで

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 & [1]。タイプ= Stuff

私のコントローラでは、queryData listパラメータには正しいデータが入力された2つのオブジェクトが含まれています。関連ノートで

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内にあります。

+0

各ステートメントに対して、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

関連する問題