2014-12-22 4 views
0

코드의 복잡성을 용서하십시오. 나는 텍스트 입력을 표시하는 페이지를 만들려고하고 여러 매개 변수가있는 게시물을 제출하는 여러 옵션을 제공하면서 목록에 포함 된 모든 항목의 텍스트 입력 값도 전달합니다. 뷰에 ViewModel의 속성으로 List를 전달합니다.하나의보기에서 여러 양식

루프의 각 항목에 대한 개별 폼을 생성하는 목록을 반복하는 For 루프가 있습니다.

@for(int s =0;s<Model.stocklist.Count; s++) 
{ 
using(Html.BeginForm("ProcessTransaction","MoveProductByInventory",FormMethod.Post)) 
{ 
      @Html.DisplayFor(m => m.stocklist[s].StorageLocation.Description) 
    <span> 
    @Html.DisplayFor(m => m.stocklist[s].UnitCurrent) 
    </span> 
    @Html.EditorFor(m => m.tranamount) 
    @Html.HiddenFor(m => m.transunittype) 
    @Html.HiddenFor(m => m.trantypeenum) 
    @Html.HiddenFor(m => m.stocklist[s].StockID) 
    <input type="submit" name="Submit" value="Add" id="btnadd" /> 
    <input type="submit" name="Submit" value="Remove" id="btnremove"/> 
} 
} 

루프의 첫 번째 반복은 완벽하게 작동하지만, 어떤 이유로 2가, 3가, 그래서 값에 다시 널 (null)로 전달되고있다.

특히,의 stocklist 속성은 주식 개체를 포함하고 다음과 같이 정의된다 :

 public List<Stock> stocklist { get; set; } 

내가 어느 내가 페이지에 선택하고 제출 버튼에 해당 주식 개체를 포함하도록 ViewModel.stocklist을 기대하고 그 for 루프의 반복에 의해 생성되었습니다.

@Html.HiddenFor(m => Model.stocklist[s].StockID) 

은 각 루프 반복마다 페이지에 적절한 스톡 ID 값을 생성합니다. 어떤 이유로 주식형은 특정 양식이 제출 될 때 (첫 번째 반복을 제외하고) stock 오브젝트를 가져 오지 않습니다. 그것은 null 참조 예외를 throw하고 stocklist는 null입니다. 페이지의 첫 번째 양식이 제출되면 stocklist는 적절한 주식 개체로 채워집니다.

더 나은 접근 방식이 있다면 알려주세요. 이것은 내가 생각해 낸 것입니다. 이것은 일반적으로 최상의 결과를 제공한다

@for(int s =0;s<Model.stocklist.Count; s++) 
{ 
    using(Html.BeginForm("ProcessTransaction","MoveProductByInventory",FormMethod.Post)) 
    { 
     @Html.DisplayFor(m => m.stocklist[s].StorageLocation.Description) 
     <span> 
     @Html.DisplayFor(m => m.stocklist[s].UnitCurrent) 
     </span> 
     @Html.EditorFor(m => m.tranamount) 
     @Html.HiddenFor(m => m.transunittype) 
     @Html.HiddenFor(m => m.trantypeenum) 
     @Html.HiddenFor(m => m.stocklist[s].StockID) 
     <input type="submit" name="Submit" value="Add" id="btnadd" /> 
     <input type="submit" name="Submit" value="Remove" id="btnremove"/> 
    } 
} 

, 나는 생각 :

감사

+0

인덱서가 0에서 시작하여 연속되어야하기 때문에 첫 번째 양식 (POST 메서드에 매개 변수 'IEnumerable model'이있는 경우에만)을 제외하고는 무엇을 할 수 있습니까? 진짜 질문은 왜 이러는거야? –

+0

답장을 보내 주셔서 감사합니다. 내가보기에 전달 된 stocklist에 포함 된 모든 레코드에 대한 데이터를 입력하는 빠른 방법을 만들려고합니다. 다음 이미지는 제가 말하는 의미를 보여줍니다 : http://imgur.com/Ec3R51D. 어쩌면 모든 stocklist 항목을 통해 반복하고 하나의 제출 단추를 사용하여 모든 값을 제출하는 단일 폼을보아야 할 것입니다. –

+0

그게 문제를 해결하고 더 나은 사용자 인터페이스가 될 것입니다. 그리고 현재 잘못된 html ('@ Html.EditorFor (m => m.tranamount)','@ Html.HiddenFor (m => m.transunittype)'등으로 많은 중복 ID를 생성하고 불필요한 컨트롤을 많이 생성합니다. 성능이 저하되고 있습니다. –

답변

0

가능하다면, 당신은 당신의 람다 함수 내에서 (m이 경우) ___For의 람다 매개 변수를 사용한다 이 경우 귀하의 문제를 해결할 것입니다. , @TrueBlueAussie이 코멘트에 아래에 설명을 제공 한 이유에 관해서는

:

DisplayFor 다른 방법은의 이름을 만들기 위해 람다 식의 식 트리를 따로 뽑아 반사를 사용 클라이언트 측 요소가 없으므로 람다 식의 컨텍스트가 일치해야합니다.

+0

정확하지만 왜 이것이 필요한지를 설명해야합니다 :) –

+0

@TrueBlueAussie 솔직히 말하면, 제 이해는 이것이 왜 필요한지 정확하게 알만큼 충분히 깊지 않습니다. 표현을 분석하고 모델과 관련하여 부동산의 위치를 ​​결정하는 것과 관련이 있다는 것을 알고 있지만 그 이상의 정확한 이유를 알지 못합니다. 어떤 힌트? :) – JLRishe

+0

그것은 가깝습니다. 'DisplayFor'와 다른 메소드는 리플렉션을 사용하여 λ 표현식의 표현 트리를 분리하여 클라이언트 측 요소의 이름을 작성하므로 람다 표현식의 컨텍스트가 일치해야합니다. –

관련 문제