2017-10-10 29 views
1

POSTを介してASP.NET MVCコントローラにGUIDの配列をパラメータとして渡す方法がわかりません。私は何が欠けていますか?これを行う簡単な方法はありますか?私のFooControllerでASP.NET MVCパラメータバインディング:リストまたは配列をコントローラメソッドにPOSTするには?

<form method="post" action="/Foo/Bar" > 
    <input name="itemIds" type="hidden" value="[&quot;8cd52539-c371-402a-b8be-12775f03ab68&quot;,&quot;8c97f9e0-666c-41ba-a914-72815745d1f0&quot;]"> 
    <button type="submit">Submit</button> 
</form> 

:HTMLになり

<form method="post" action="/Foo/Bar" > 
    <input name="itemIds" type="hidden" value="{{ ctrl.itemIds }}"> 
    <button type="submit">Submit</button> 
</form> 

:私のAngularJSマークアップで

は、私が上記デバッグする場合

[System.Web.Mvc.HttpPost] 
public ActionResult Bar([FromBody]Guid[] itemIds) => ... 

、私のHTTPのPOSTがいるようです正解ですが、itemIdsBarになります。これを変えるのを手伝ってもらえますか? JSモデルにGUIDの配列が既にあるため、リクエストボディにデータを格納するには、より良い方法がありますか?ここで

+0

私は 'Guid'が' string'として出現すると信じています。それであなたは 'Guid'にキャストします。奇妙な理由から、上記のようなデフォルトのMVCパラメータを使用すると、通常、型を安全にキャストできません。 – Greg

+0

それは私を悲しくする。パラメータをGuid []の代わりに文字列に変更すると、バックスラッシュ、角括弧、カンマを含む単一の文字列が生成されます。よりエレガントな方法のアイデア - 私は文字列の配列またはリストを取得することができます少なくとも1つの文字列よりも? –

+0

基本的なJsonオブジェクトを作成して渡すことができます。単一のデシリアライズで、狂ったエンコーディングの一部を避けることができます。'{Id = ''}'オブジェクトの型で、Idプロパティを持つ基本オブジェクトです。明らかに有効なJsonが役に立ちます。 – Greg

答えて

2

は本当に何が起こっているのかである:

itemIdsは、コントローラに1つの文字列として掲載されています。どうして? itemIdsは配列として解釈されないためです。配列が必要な場合は、itemIds[0]itemsIds[1]という名前の複数の隠し値が必要です。私が言っていることが実際に起こっていることを証明するための簡単なテストです:

このようなフォームを作成します。我々はitemIdsOldという名前の1つの隠れた値を作成してください、その後itemIds[0]itemIds[1]という名前の2つの以上の隠し値:

<form method="post" action="/Foo/Bar"> 
    <input name="itemIdsOld" type="hidden" value="[&quot;f8b21933-419c-4bdd-b5b6-75295ff65612&quot;,&quot;67bb1d75-ae78-49e4-bc29-ee82a51bb9a1&quot;]"> 
    <input name="itemIds[0]" type="hidden" value="f8b21933-419c-4bdd-b5b6-75295ff65612"> 
    <input name="itemIds[1]" type="hidden" value="67bb1d75-ae78-49e4-bc29-ee82a51bb9a1"> 
    <button type="submit">Submit</button> 
</form> 

このようなコントローラーを作成します。

[System.Web.Mvc.HttpPost] 
public ActionResult Index(string[] itemIdsOld, Guid[] itemIds) 
{ 
    return null; 
} 

あなたは上記のフォームを投稿すると、あなたがいることに気づくでしょう単一の文字列がitemIdsOldに作成され、両方のGuidにstringというGUIDが含まれます。ただし、itemIds[0]itemIds[1]という名前のコントロールを作成してから、2番目はGuid[] itemIdsに変換されます。

私は角度でこれを行う方法がわからないけど、C#やカミソリで、それを行うための一つの方法は次のようになります:

@using System.Collections.Generic 
@{ 
    var guids = new List<Guid> { Guid.NewGuid(), Guid.NewGuid() }; 
} 
<form method="post" action="/Test/Index"> 
    <input name="itemIdsOld" type="hidden" value="[&quot;f8b21933-419c-4bdd-b5b6-75295ff65612&quot;,&quot;67bb1d75-ae78-49e4-bc29-ee82a51bb9a1&quot;]"> 
    @{ 
     for (int i = 0; i < guids.Count; i++) 
     { 
      <input name="itemIds[@i]" type="hidden" value="@guids[i]"> 
     } 
    } 
    <button type="submit">Submit</button> 
</form> 

私はハードGUIDをコード化されていますから、これを取得することができますモデル...あなたはポイントを得る。


また、あなたがフォームの送信を傍受するためにJavascriptを使用してitemIdsから値を取得し、配列にそれを回すと、コントローラにそれを提出することができ、それはあまりにも動作します。

+0

はい。私は角度リグを使ってそれを行うためにng-repeatを使うことができます - これが最善の方法かもしれません。 POSTを行い、隠されたフォームフィールドを徹底するのではなく、JSON本体を提供するという考え方はありますか? –

+0

隠されたフォームフィールドを経由するのではなく、JSON本体の意味を理解できません。 – CodingYoshi

+0

Rube Goldbergマシンのように、AngularJSを介して隠れたフォームフィールドを設定して、私がJavascriptコードの状態でPOSTを行うのに必要なすべてのデータを持っているときにPOSTできるようです。これがAJAXの場合は、AJAXリクエストを作成して終了しますが、Javascriptコードから非AJAX POSTリクエストを作成する方法はありません。 –

関連する問題