我正在使用ASP.NET MVC4構建移動網站。 我的解決方案中的一個頁面包含一個表格,表格中的所有行都可以在同一批次中進行編輯和保存。爲此,我在Controller中的Action中使用了FormCollection。這可以按預期的方式在大多數字段中運行,即免除一項:item.IsPercent。這個字段是一個布爾值,並且FormCollection.GetValues(「item.IsPercent」)返回表中行數的兩倍,列表總是在true和false之間交替,不管實際值是什麼。ASP.NET MVC4 FormCollection.GetValues無法返回正確的值
如何爲百分比複選框收集正確的值?
爲例
我的視圖
@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++;
}
}
嗨,thanx很多!但我怎樣才能得到複選框,而不是隱藏的字段值? –
嗨!這篇文章顯示你需要什麼:http://stackoverflow.com/questions/1714989/formcollection-for-a-checkbox – Fals