2017-02-09 19 views
0

양식 제출을 통해 중첩 된 데이터를 ActionResult 매개 변수에 게시하려면 어떻게해야합니까? 나는 this question에 대한 답변과 비슷한 해결책을 구현하려고 시도했지만 많은 행운이 없다. 다음과 같이MVC에 게시 된 복잡한 구조를 잡는 방법

문제의 형태의 단면 구조는 다음과 같습니다 모델에서

Form Submission Event: (BaseController:57-ish): 
{ 
    ... 
    "Prices[1].Price": "9.9900", 
    "Prices[1].Size2Price": "0.0000", 
    "Prices[1].Size3Price": "0.0000", 
    "Prices[2].Price": "5.5800", 
    "Prices[2].Size2Price": "0.0000", 
    "Prices[2].Size3Price": "0.0000", 
    "Prices[3].Price": "0.0000", 
    "Prices[3].Size2Price": "0.0000", 
    "Prices[3].Size3Price": "0.0000", 
    ... 
} 

:

<form method="post" action="/Product/Edit" class="tabs"> 
    <input name="Prices[1].Price" id="Prices_1__Price" value="9.99" type="text"> 
    <input name="Prices[1].Size2Price" id="Prices_1__Size2Price" value="0.00" type="text"> 
    <input name="Prices[1].Size3Price" id="Prices_1__Size3Price" value="0.00" type="text"> 
    <input name="Prices[2].Price" id="Prices_2__Price" value="5.00" type="text"> 
    <input name="Prices[2].Size2Price" id="Prices_2__Size2Price" value="0.00" type="text"> 
    <input name="Prices[2].Size3Price" id="Prices_2__Size3Price" value="0.00" type="text"> 
    <input name="Prices[3].Price" id="Prices_3__Price" value="0.00" type="text"> 
    <input name="Prices[3].Size2Price" id="Prices_3__Size2Price" value="0.00" type="text"> 
    <input name="Prices[3].Size3Price" id="Prices_3__Size3Price" value="0.00" type="text"> 
    <button type="submit">submit</button> 
</form> 

이는 게시 된 데이터가 예상대로 표시로, 로그 벌금을 통해오고있다 , 나는 가격의 수집을 잡으려고 변이를 시도하고있다, 현재의 시도는 다음과 같다 :

나는 "EditedProductEntry"데이터 구조 수신 "편집"ActionResult이 컨트롤러 측면에서

: 나는 "포스트"매개 변수의 구조는 "가격을 받아 가지고 시도에 대해 조롱했습니다

[HttpPost] 
[Route("Edit", Name = "Product_Edit")] 
public ActionResult Edit(EditedProductEntry post) 
{ 
    ... 
} 

에게 "컬렉션하지만 이것은 나를 곤란하게 만든다. 데이터의 나머지 부분은 &이 "EditedProductEntry"개체를 채우고 있지만 나머지는 null입니다.

개체 [], EditedProductEntry [], ICollection, IEnumerable을 잡으려고 시도했습니다. &도 이러한 매개 변수를 "편집"작업에 추가 매개 변수로 지정하려고 시도했지만 지금까지 아무런 행운을 얻지 못했습니다.

다른 아이디어가 있습니까?

+2

1 대신 인덱스 0을 시작하거나 모델 바인딩 컬렉션에 대해 비 순차 인덱스 바인딩을 사용하십시오. - http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx /. 두 번째 접근 방식을 권장합니다. – Developer

+1

DataContract 및 DataMember 특성은 필요하지 않습니다. (아마도 코드에 잡음을 추가하는 데 사용되어야합니다.) –

+0

입력을 수동으로 생성하는 것은 미친 일입니다. 기존 항목 인 경우 [이 답변] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943)을 참조하십시오. 항목을 동적으로 추가/제거하는 경우 thew보기, 참조 [이 답변] (http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308) –

답변

1

로컬 컴퓨터에서 동일한 사례를 시도하고 컨트롤 이름의 인덱싱이 올바르지 않습니다.

컨트롤 이름은 0부터 시작하는 인덱스와 너무 게시 된 데이터를 따라야합니다.

입력 컨트롤은 다음과 같이 선언해야합니다.

<input name="Prices[0].Price" id="Prices_1__Price" value="9.99" type="text"> 
<input name="Prices[0].Size2Price" id="Prices_1__Size2Price" value="0.00" type="text"> 
<input name="Prices[0].Size3Price" id="Prices_1__Size3Price" value="0.00" type="text"> 
<input name="Prices[1].Price" id="Prices_2__Price" value="5.00" type="text"> 
<input name="Prices[1].Size2Price" id="Prices_2__Size2Price" value="0.00" type="text"> 
<input name="Prices[1].Size3Price" id="Prices_2__Size3Price" value="0.00" type="text"> 
<input name="Prices[2].Price" id="Prices_3__Price" value="0.00" type="text"> 
<input name="Prices[2].Size2Price" id="Prices_3__Size2Price" value="0.00" type="text"> 
<input name="Prices[2].Size3Price" id="Prices_3__Size3Price" value="0.00" type="text"> 

따라서 로그 파일에도 다음 데이터가 있습니다.

"Prices[0].Price": "9.9900", 
"Prices[0].Size2Price": "0.0000", 
"Prices[0].Size3Price": "0.0000", 
"Prices[1].Price": "5.5800", 
"Prices[1].Size2Price": "0.0000", 
"Prices[1].Size3Price": "0.0000", 
"Prices[2].Price": "0.0000", 
"Prices[2].Size2Price": "0.0000", 
"Prices[2].Size3Price": "0.0000", 

이렇게 변경하면 문제가 해결됩니다.

+0

아, 감사하는 모든 사람에게 감사하십시오. 당신은 색인 생성에 대해 옳았습니다. 저는 "PriceCollection"개체에 숨겨진 필드로 전달하는 대신 색인의 가격 수준 ID를 사용하여 바보 같았습니다. –