2012-07-06 76 views
0

我重寫了我的頁面以使用EditorTemplates。他們非常好。但是,當我回發只有第一行的帖子回數據。其他4行顯示爲空。 FormSection有一個FormRowModel的列表。 FormRows有一個CtrlInputDataModel列表。我的代碼如下。爲什麼EditorTemplate不顯示數據?

指數

@model InspectionWebFormsMVC.ViewModels.FormSection 

@{ 
    ViewBag.Title = "Testing Editor Templates"; 
} 

<h2>Test Control for Webforms</h2> 

@Html.EditorFor(x => x.sectionRows, "FormRowModel") 

EditorTemplate/FormRowModel

@model InspectionWebFormsMVC.ViewModels.FormRowModel 

@using (Html.BeginForm("Index", "TestEdit", FormMethod.Post)) 
{ 
    int i = 0; 

    //var testCtrls = Model.Where(x => x.RowInput.Where(y => types.Contains(y.RowCtrl.Type))); 
    <div style="clear:both; padding:1%;">  
     <div class="section"> 
      @Model.Section 
     </div> 
     <div class="number"> 
      @Model.SectionNumber 
     </div> 
     <div class="desc"> 
      @Model.Description 
     </div> 
     <div class="ctrl"> 
      @{ 
       List<string> types = new List<string>() { "dropdown", "text", "radio", "checkbox" }    
       @Html.EditorFor(y => y.RowInput.Where(z => types.Contains(z.RowCtrl.Type)), "CtrlInputDataModel") 
      } 
     </div> 

EditorTemplate/CtrlInputDataModel

@model InspectionWebFormsMVC.ViewModels.CtrlInputDataModel 

@{ 
    var ddv = new SelectList(Model.RowCtrl.DefaultValues, "Value", "Label"); 

    switch (Model.RowCtrl.Type) 
    { 
     case "dropdown": 
      //@Html.DropDownListFor(blah => Model.InputtedData, ddv) 
      //@Html.HiddenFor(blah => Model.InputtedDataID) 
      //@Html.HiddenFor(blah => Model.RowCtrl.CtrlTypeID) 

      @Html.DropDownList("InputtedData", ddv)         
      @Html.Hidden("InputtedDataID", Model.InputtedDataID) 
      @Html.Hidden("CtrlTypeID", Model.RowCtrl.CtrlTypeID) 
      <br /> 
     break; 
     case "text": 
      //@Html.TextBoxFor(blah => Model.InputtedData) 
      //@Html.HiddenFor(blah => Model.InputtedDataID) 
      //@Html.HiddenFor(blah => Model.RowCtrl.CtrlTypeID) *@ 

      @Html.TextBox("InputtedData", Model.InputtedData) 
      @Html.Hidden("InputtedDataID", Model.InputtedDataID) 
      @Html.Hidden("CtrlTypeID", Model.RowCtrl.CtrlTypeID) 
      <br /> 
     break; 
     case "radio": 
      foreach (var sli in ddv) 
      { 
       //@Html.LabelFor(blah => Model.InputtedData, sli.Text) 
       //@Html.RadioButtonFor(blah => Model.InputtedData, sli.Value) 

       @Html.Label("InputtedData", sli.Text) 
       @Html.RadioButton("InputtedData", Model.InputtedData, sli.Value) 
      } 
      //@Html.HiddenFor(blah => Model.InputtedDataID) 
      //@Html.HiddenFor(blah => Model.RowCtrl.CtrlTypeID) 

       @Html.Hidden("InputtedDataID", Model.InputtedDataID) 
       @Html.Hidden("CtrlTypeID", Model.RowCtrl.CtrlTypeID)          
       <br /> 
     break; 
     case "checkbox": 
      foreach (var sli in ddv) 
      { 
       //@Html.LabelFor(blah => Model.InputtedData, sli.Text) 
       //@Html.RadioButtonFor(blah => Model.InputtedData, sli.Value) 

       @Html.Label("InputtedDataID", sli.Text) 
       //@Html.CheckBox("InputtedData", false) 

      } 
       //@Html.HiddenFor(blah => Model.InputtedDataID) 
       //@Html.HiddenFor(blah => Model.RowCtrl.CtrlTypeID) 

       @Html.Hidden("InputtedDataID", Model.InputtedDataID) 
       @Html.Hidden("CtrlTypeID", Model.RowCtrl.CtrlTypeID) 
       <br /> 
     break; 
    } 
} 

生成的HTML

<form action="/TestEdit" method="post">  
    <div style="clear:both; padding:1%;">  
     <div class="section"> 
      A 
     </div> 
     <div class="number"> 
      1 
     </div> 
     <div class="desc"> 
      First Row 
     </div> 
     <div class="ctrl"> 

<select id="sectionRows_0__RowInput_0__InputtedData" name="sectionRows[0].RowInput[0].InputtedData"><option value="1">Yes</option> 
<option value="0">No</option> 
</select><input data-val="true" data-val-number="The field InputtedDataID must be a number." data-val-required="The InputtedDataID field is required." id="sectionRows_0__RowInput_0__InputtedDataID" name="sectionRows[0].RowInput[0].InputtedDataID" type="hidden" value="1" /><input data-val="true" data-val-number="The field CtrlTypeID must be a number." data-val-required="The CtrlTypeID field is required." id="sectionRows_0__RowInput_0__RowCtrl_CtrlTypeID" name="sectionRows[0].RowInput[0].RowCtrl.CtrlTypeID" type="hidden" value="1" />   <br /> 
    </div> 
</form> 

<form action="/TestEdit" method="post">  
    <div style="clear:both; padding:1%;">  
     <div class="section"> 
      A 
     </div> 
     <div class="number"> 
      2 
     </div> 
     <div class="desc"> 
      Second Row of Halls 
     </div> 
     <div class="ctrl"> 

<select id="sectionRows_1__RowInput_0__InputtedData" name="sectionRows[1].RowInput[0].InputtedData"><option value="1">Accept</option> 
<option value="0">Reject</option> 
</select><input data-val="true" data-val-number="The field InputtedDataID must be a number." data-val-required="The InputtedDataID field is required." id="sectionRows_1__RowInput_0__InputtedDataID" name="sectionRows[1].RowInput[0].InputtedDataID" type="hidden" value="2" /><input data-val="true" data-val-number="The field CtrlTypeID must be a number." data-val-required="The CtrlTypeID field is required." id="sectionRows_1__RowInput_0__RowCtrl_CtrlTypeID" name="sectionRows[1].RowInput[0].RowCtrl.CtrlTypeID" type="hidden" value="2" />   <br /> 


<input id="sectionRows_1__RowInput_1__InputtedData" name="sectionRows[1].RowInput[1].InputtedData" type="text" value="UP, UP, DOWN, DOWN, LEFT, LEFT, RIGHT, RIGHT, B, A, B, A, START" /><input data-val="true" data-val-number="The field InputtedDataID must be a number." data-val-required="The InputtedDataID field is required." id="sectionRows_1__RowInput_1__InputtedDataID" name="sectionRows[1].RowInput[1].InputtedDataID" type="hidden" value="6" /><input data-val="true" data-val-number="The field CtrlTypeID must be a number." data-val-required="The CtrlTypeID field is required." id="sectionRows_1__RowInput_1__RowCtrl_CtrlTypeID" name="sectionRows[1].RowInput[1].RowCtrl.CtrlTypeID" type="hidden" value="6" />   <br /> 
    </div> 
</form> 

<form action="/TestEdit" method="post">  
    <div style="clear:both; padding:1%;">  
     <div class="section"> 
      A 
     </div> 
     <div class="number"> 
      3 
     </div> 
     <div class="desc"> 
      Third Row of fits and fixes and polishes 
     </div> 
     <div class="ctrl"> 

<input id="sectionRows_2__RowInput_0__InputtedData" name="sectionRows[2].RowInput[0].InputtedData" type="text" value="50" /><input data-val="true" data-val-number="The field InputtedDataID must be a number." data-val-required="The InputtedDataID field is required." id="sectionRows_2__RowInput_0__InputtedDataID" name="sectionRows[2].RowInput[0].InputtedDataID" type="hidden" value="3" /><input data-val="true" data-val-number="The field CtrlTypeID must be a number." data-val-required="The CtrlTypeID field is required." id="sectionRows_2__RowInput_0__RowCtrl_CtrlTypeID" name="sectionRows[2].RowInput[0].RowCtrl.CtrlTypeID" type="hidden" value="3" />   <br /> 
    </div> 
</form> 

編輯:

我把它換成以下 -

<div class="ctrl"> 
       @{ 
        List<string> types = new List<string>() { "dropdown", "text", "radio", "checkbox" }    
        @Html.EditorFor(y => y.RowInput.Where(z => types.Contains(z.RowCtrl.Type)), "CtrlInputDataModel") 
       } 
</div> 

<div class="ctrl"> 
      @{ 
       //List<string> types = new List<string>() { "dropdown", "text", "radio", "checkbox" }; 
       //var yy = Model.RowInput.Where(z => types.Contains(z.RowCtrl.Type));    
       @Html.EditorFor(y => y.RowInput) 
      } 
</div> 

@Html.EditorFor(x => x.sectionRows, "FormRowModel") 

@Html.EditorFor(x => x.sectionRows) 

還是得到了同樣的結果。只有第一行回傳數據。其他行回到空。

+0

尷尬的消息。我給我的文件夾命名爲:DisplayTemplate和EditorTemplate。它應該是:DisplayTemplates和EditorTemplates – dotnetN00b 2012-07-06 23:29:42

+0

現在我遇到的問題是它將回發第一行的數據。但其他人都沒有。我有一種感覺,它與命名有關。我的模型有一個列表。那個列表裏面有另一個列表。 – dotnetN00b 2012-07-06 23:48:19

+0

模型綁定與for循環有一些問題。建議用模板替換它們。 – 2012-07-07 03:59:58

回答

1

所以在Darin的幫助下,我將局部視圖轉換爲editortemplates。在這種情況下,它是Good Thing(TM)。但是,我只能將回收的第一行收回。一些谷歌搜索後,我跑過this page(這也是由各種stackoverflow問題引用)。在執行這一小段代碼之後,沒有任何事情可以回傳。然後我跑過this post on StackOverflow。並看到我引用了該集合的錯誤名稱。我需要引用屬性而不是型號名稱。現在一切都按照應有的方式工作。

非常感謝Darin直接或間接地爲我提供了幫助(和其他人)。謝謝!

對於任何人,讓史蒂夫的代碼工作有點麻煩,please look at this page。這是一個總體解決方案,讓自定義htmlhelpers一般工作。