2013-07-16 77 views
0

我正在使用ASP.NET MVC4構建移動網站。 我的解決方案中的一個頁面包含一個表格,表格中的所有行都可以在同一批次中進行編輯和保存。爲此,我在Controller中的Action中使用了FormCollection。這可以按預期的方式在大多數字段中運行,即免除一項:item.IsPercent。這個字段是一個布爾值,並且FormCollection.GetValues(「item.IsPercent」)返回表中行數的兩倍,列表總是在true和false之間交替,不管實際值是什麼。ASP.NET MVC4 FormCollection.GetValues無法返回正確的值

如何爲百分比複選框收集正確的值?

爲例

enter image description here

我的視圖

@using (Html.BeginForm()) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

foreach (var group in Model.GroupBy(i => i.Exercise.Name)) { 
<table> 
<tr> 
     <th colspan="4">@Html.Label(group.Key)</th> 
</tr> 
    <tr> 
     <td>Load</td> 
     <td>Percent</td> 
     <td> </td> 
     <td>Reps</td> 
    </tr> 
@foreach (var item in group.OrderBy(i => i.Order)) 
    { 

    @Html.HiddenFor(modelItem => item.Id) 
    <tr> 

     <td> 
      @Html.EditorFor(modelItem => item.Load) 
      @Html.ValidationMessageFor(modelItem => item.Load) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.IsPercent) 
     </td> 
     <td> 
      x 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.Repetitions) 
      @Html.ValidationMessageFor(modelItem => item.Repetitions) 
     </td> 
    </tr> 
    } 
    </table> 
    <br /> 
} 

<p> 
    <input type="submit" value="Save" /> 
</p> 
} 

我的控制器

[HttpPost] 
    public ActionResult EditProgramTemplateLines(FormCollection c) 
    { 
     int i = 0; 
     int ptId = 0; 
     if (ModelState.IsValid) 
     { 
      var ptIdArray = c.GetValues("item.id"); // [1,2,3,4] 
      var ptLoadArray = c.GetValues("item.Load"); // [50, 55, 60, 80] 
      var ptPercentArray = c.GetValues("item.IsPercent"); // [true, false, true, false, true, false, true, false] 
      var ptRepsArray = c.GetValues("item.Repetitions"); // [13, 10, 5, 2] 

      for (i = 0; i < ptIdArray.Count(); i++) { 
       var ptLine = factory.GetProgramTemplateLine(Convert.ToInt32(ptIdArray[i])); 
       if(ptId == 0) 
        ptId = ptLine.ProgramTemplateId; 

       ptLine.Load = ConvertToDouble(ptLoadArray[i]); 
       ptLine.IsPercent = Convert.ToBoolean(ptPercentArray[i]); 
       ptLine.Repetitions = ConvertToInt(ptRepsArray[i]); 
       factory.SetEntryAsModified(ptLine); 

      } 
      factory.SaveChanges(); 
      return RedirectToAction("Details", new { id = ptId }); 
     } 
     return View(); 
    } 

更新的解決方案 考慮貼在下面FormCollection for a checkbox評論循環數組通過量這樣的鏈接我的解決方案是:

var percentId = 0; 
for(i = 0;i<ptIdArray.Count();i++){ 
if(ptPercentArray[percentId] == true){ 
item.IsPercent = true; 
percentId = percentId + 2; 
} 
else{ 
item.IsPercent = false; 
percentId++; 
} 
} 

回答

2

看看爲Html.EditorFor生成的HTML!幫助者創建一個複選框和一個隱藏字段爲每個複選框在服務器端輕鬆進行狀態管理!那就是問題所在!使用FormCollection作爲參數,您需要區分隱藏的和真實的複選框才能獲得該值!

希望這對你有所幫助!

+0

嗨,thanx很多!但我怎樣才能得到複選框,而不是隱藏的字段值? –

+0

嗨!這篇文章顯示你需要什麼:http://stackoverflow.com/questions/1714989/formcollection-for-a-checkbox – Fals