2013-09-26 1 views
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# 호출에 항목의 내 배열을받을 수 있나요?

+0

입력 내용에 이름이 없습니다 ... JSON을 제출하는 것은 JSON 인코딩 된 매개 변수가 아니라 전통적인 POST/GET을 사용하는 것입니다. –

+0

form = "post"형식 뒤에 ...를 포함시킬 수 있습니까? – Kristof

답변

2

listitem을 자바 스크립트에서 매개 변수로 문자열로 serialize하고 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> 

컨트롤러

당신은 당신이 "항목"과 같은 변수에 JSON 배열의 제출 포장해야
[HttpPost] 
public void MyItems(string data) 
{ 
    JavaScriptSerializer parser = new JavaScriptSerializer(); 
    var info = parser.Deserialize<List<Item>>(data); 
} 
+0

나는 이것을 작동시키지 않는 것 같다. 404 오류가 발생합니다 - 요청과 일치하는 HTTP 리소스가 없습니다. – Zholen

1

, 그것은 변수 이름과 일치해야합니다. ASP.NET은 JSON을 객체에 자동으로 deserialize합니다. 수동으로 처리 할 필요가 없습니다. 나는 이것을 충분히 테스트 해 본 결과 자주 사용된다는 것을 알고 있습니다.

[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;} 
} 

그리고 문제는 당신이 HTML 형식이 아닌 JSON을 게시하고있다

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(); 
0

자바 스크립트, 당신은 JSON 문자열을 얻을 수있는 원시 형태로 얻을 필요가 데이터를 기록거야 아웃. 일반적으로이 작업은 Request.Form? 누락 된 태그가 누락 된 태그의 name 속성 인 것 같습니다. 당신은 장소에이 같이 간단 할 것을 일단 :

또한 도움이 될 수
<input type="hidden" name="MyHiddenElement" data-bind="value:ko.toJSON($data)" /> 

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

한 가지 숨겨진 태그의 수를 아래로 던져 그들에게 모두 같은 이름을 주면, 당신이 할 수 있다는 것입니다 지정된 이름의 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"]; 
관련 문제