2014-01-23 80 views
1

我有我的視圖模型中的吉他對象列表。模型中的非序列列表

public List<Guitar> Guitars { get; set; } 

用戶可以通過單擊按鈕(感謝JQuery克隆())創建這些。我注意到他們是否刪除了第一個列表項([0])該模型返回一個空列表,或者如果它們像[1]一樣在列表中刪除了某些內容,則該模型僅返回列表中的項[0]。

我在原始請求中看到所有項目都存在,所以我想我有2個選擇 - 也許有人有不同的方法?

1.操作原始請求陣列上在這樣的控制器:

[HttpPost] 
public ActionResult Index(CustomerViewModel customer) 
{ 

     var guitars = new List<Guitar>(); 
     var listValues = new List<string>(); 
     var numGuitars = 0; 

     //Loop through all Request keys in the POST 
     foreach (string key in Request.Form.AllKeys) 
     { 

      //Save any that are part of the Guitar object 
      if (key.StartsWith("Guitars[")) 
      { 
       listValues.Add(key); 
      } 

     } 

     //Guitar object has 3 properties so divide by 3 to get total object count 
     numGuitars = (int)Math.Ceiling(listValues.Count/3.0); 

     for (int i = 0; i < numGuitars; i++) 
     { 

      var guitarMake = Request["Guitars[" + i + "].Make"]; 
      var guitarModel = Request["Guitars[" + i + "].Model"]; 
      var guitarProductonYear = Request["Guitars[" + i + "].ProductionYear"]; 

      if (!String.IsNullOrEmpty(guitarMake) && 
       !String.IsNullOrEmpty(guitarModel) && 
       !String.IsNullOrEmpty(guitarProductonYear)) 
      { 
       var g = new Guitar 
        { 
         Make = guitarMake, 
         Model = guitarModel, 
         ProductionYear = Int32.Parse(guitarProductonYear) 
        }; 
       guitars.Add(g); 
      } 
     } 

2.當用戶刪除的項目,使用JQuery重新分配列表索引,所以我們是順序。

3.還有什麼?

表HTML

<div id="guitars_1" style="display: block;"> 
    <input type="text" value="" name="Guitars[0].Make" id="Guitars_0__Make" placeholder="Make"> 
    <input type="text" value="" name="Guitars[0].Model" id="Guitars_0__Model" placeholder="Model"> 
</div> 
<div id="guitars_2" style="display: block;"> 
    <input type="text" value="" name="Guitars[1].Make" id="Guitars_1__Make" placeholder="Make"> 
    <input type="text" value="" name="Guitars[1].Model" id="Guitars_1__Model" placeholder="Model"> 
</div> 
    <div id="guitars_3" style="display: block;"> 
    <input type="text" value="" name="Guitars[2].Make" id="Guitars_2__Make" placeholder="Make"> 
    <input type="text" value="" name="Guitars[2].Model" id="Guitars_2__Model" placeholder="Model"> 
</div> 

<!-- Start Add Guitar Row Template --> 
<div style="display:none"> 
    <div id="guitarsTemplate"> 
      <div class="formColumn1"><label>Guitar</label></div> 
      <div class="formColumn2">@Html.TextBoxFor(model => model.Guitars[0].Make, new { Placeholder = "Make" }) 
       <div class="messageBottom"> 
          @Html.ValidationMessageFor(model => model.Guitars[0].Make) 
        </div> 
      </div> 
      <div class="formColumn3">@Html.TextBoxFor(model => model.Guitars[0].Model, new { Placeholder = "Model" }) 
       <div class="messageBottom"> 
        @Html.ValidationMessageFor(model => model.Guitars[0].Model) 
       </div> 
      </div> 
      <div class="formColumn4">@Html.TextBoxFor(model => model.Guitars[0].ProductionYear, new { Placeholder = "Production Year" }) 
         <div class="messageBottom"> 
          @Html.ValidationMessageFor(model => model.Guitars[0].ProductionYear) 
         </div><a class="icon delete">Delete</a> 
         </div> 

     </div> 
</div>  
<!-- End Add Guitar Row Template --> 

JS是克隆和刪除項目

$(document).ready(function() { 
     var uniqueId = 1; 
     var ctr = 0; 
     $(function() { 
      $('.js-add-guitar-hyperlink').click(function() { 

       var copy = $("#guitarssTemplate").clone(true).appendTo("#addGuitarSection").hide().fadeIn('slow'); 
       var guitarDivId = 'guitars_' + uniqueId; 
       var copyText = copy.html(); 

       copyText = copyText.replace(/Guitars\[0\]/g, 'Guitars[' + ctr + ']'); 
       copyText = copyText.replace('Guitars_0', 'Guitars_' + ctr); 
       copy.html(copyText); 
       $('#guitarsTemplate').attr('id', guitarDivId); 

       var deleteLink = copy.find("a.icon.delete"); 
       deleteLink.on('click', function() { 
        copy.fadeOut(300, function() { $(this).remove(); }); //fade out the removal 

       }); 

       $('#' + cosponsorDivId).find('input').each(function() { 
        //$(this).attr('id', $(this).attr('id') + '_' + uniqueId); 
        // $(this).attr('name', $(this).attr('name') + '_' + uniqueId); 



       }); 

       uniqueId++; 
       ctr++; 
      }); 
     }); 
    }); 

回答