1

それぞれが 5 つのフィールドを持つオブジェクトの配列があり、フォーム送信でその配列を送信したいと考えています。しかし、私はnullになり続け、何が間違っているのかわかりません。

<form method="post" ....>
<table>
<!-- ko foreach: items-->
<tr>
   <td>
      <span data-bind="text: Category"></span>
      <input type="hidden" data-bind="value:ko.toJSON($data)" />
   </td>
</tr>
<!-- /ko -->
</table>
</form>


 [HttpPost]
 public void MyItems(List<Item> data)
 {

 }

項目は JavaScript オブジェクトの JSON と一致します。

項目の配列を C# 呼び出しに取得するにはどうすればよいですか?

4

3 に答える 3

2

listitem を javascript のパラメーターとして文字列にシリアライズし、アクション mvc でデシリアライズすることができます。

<form method="post" ....>
<table>
<!-- ko foreach: items-->
<tr>
   <td>
      <span data-bind="text: Category"></span>
      <input type="hidden" value="ko.toJSON($data)" />
   </td>
</tr>
<!-- /ko -->
</table>
</form>

コントローラ

 [HttpPost]
 public void MyItems(string data)
 {
    JavaScriptSerializer parser = new JavaScriptSerializer();
    var info = parser.Deserialize<List<Item>>(data);
 }
于 2013-09-27T02:23:34.670 に答える
1

JSON 配列の送信を「items」などの変数でラップする必要があります。変数名が一致することが重要です。ASP.NET は、JSON をオブジェクトに自動的に逆シリアル化します。手動で行う必要はありません。私はこれを完全にテストし、頻繁に行うので、うまくいくことがわかっています。

[HttpPost]
// Note how the argument name is "items"
 public ActionResult MyItems(List<Item> items)
 {
     // set a breakpoint and check the items List
     return Content("success")
 }

public class Item
{
// Make sure to use public properties get/set
    public string Category {get;set;}
}

そしてあなたのJavaScript

function Item()
{
    this.Category = ko.observable();
}

function ViewModel()
{
    this.Items = ko.observableArray();

    this.submit = function() {
        // note how we make sure argument name matches "items" as in Controller
        var myData = ko.toJSON(  { items: this.Items() });

        $.ajax({
            url: '/Home/MyItems',
            contentType: 'application/json',
            type: 'POST',
            data: myData,
            success: function(data){
                // check result
            }
        })

    }
}

var vm = new ViewModel();
ko.applyBindings(vm);

var item1 = new Item();
item1.Category("Cat1");
vm.Items.push(item1);

vm.submit();
于 2013-10-01T20:53:58.730 に答える
0

問題は、HTML フォームではなく、フォームを投稿していることです。文字列JSONを取得するには、データを投稿した生のフォームに入る必要があります。JSON通常、これはRequest.Form?で行われます。name隠しタグの属性が欠けているようです。配置したら、次のように簡単になります。

<input type="hidden" name="MyHiddenElement" data-bind="value:ko.toJSON($data)" />

string json = Request.Form["MyHiddenElement"];

また、役立つかもしれないことの 1 つは、多数の非表示タグをスローしてそれらにすべて同じ名前を付けると、指定された名前の Request.Form を実行でき、カンマ区切りの配列リストが返されることです。<Input隠された価値。これは、複雑なデータ ポスト シナリオで非常に役立ちます。

<input type='hidden' name="MyHiddenElement" value="1" />
<input type='hidden' name="MyHiddenElement" value="2" />
<input type='hidden' name="MyHiddenElement" value="3" />

string csvList = Request.Form["MyHiddenElement"];
于 2013-10-01T22:09:15.663 に答える