ASP.NET 当跳过一项时,MVC 5 没有获得绑定复选框中的所有项目
ASP.NET MVC 5 not getting all items in bound checkbox when skiping one item
绑定复选框时,如果我使用 at for next 循环并跳过一个项目,它不会绑定所有项目。
这是我的代码:
型号:
public class UserViewModel
{
public string Id { get; set; }
public string Email { get; set; }
public IList<Meal> Meals { get; set; }
}
public class Meal
{
public string MealId { get; set; }
public string MealName { get; set; }
public bool HasMeal { get; set; }
}
剃须刀:
<div class="form-group">
@Html.HiddenFor(model => model.Id)
</div>
<div class="form-group">
@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
</div>
@*Meals CheckBoxes*@
@for (var i = 0; i < Model.Meals.Count(); i++)
{
if (Model.Meals[i].MealsName == "JunkFood")
{
continue;
}
<div class="form-group">
@Html.Label(Model.Meals[i].MealName, htmlAttributes: new { @class = "control-label col-md-5" })
<div class="col-md-7">
<div class="checkbox">
@Html.EditorFor(x => Model.Meals[i].HasMeal)
</div>
</div>
@Html.HiddenFor(x => Model.Meals[i].MealId)
@Html.HiddenFor(x => Model.Meals[i].MealName)
@Html.HiddenFor(x => Model.Meals[i].HasMeal)
</div>
}
在 html 中,我得到了预期的停产 itemId...
<input name="Roles[0].HasMeals" type="hidden" value="false">
<input name="Roles[1].HasMeals" type="hidden" value="false">
<input name="Roles[2].HasMeals" type="hidden" value="false">
<input name="Roles[3].HasMeals" type="hidden" value="false">
<input name="Roles[5].HasMeals" type="hidden" value="false">
与其他控件相同
<input class="check-box" data-val="true" id="<Meals_3__HasRole" name="Meals[3].HasRole" type="checkbox" value="true">
<input class="check-box" data-val="true" id="<Meals_5__HasRolenter code here" name="Meals[5].HasRole" type="checkbox" value="true">
然后在控制器中我只得到 4 个项目而不是 5 个。
如果我在 for next 循环中取出 continue 语句,一切正常,但它显示了我想隐藏的 junkFood 复选框...
控制器
[HttpPost]
public async Task<ActionResult> Edit([Bind(Include = "Id,Email, Meals")] UserViewModel userViewModel)
{
if (ModelState.IsValid)
{
....
UserViewModel.Meals.Count 是 4
有什么提示吗?
问题是,如果您跳过 MealsName == "JunkFood" 的整个迭代,视图将不会为整个集合生成必要的输入名称。
改为这样做:
@*Meals CheckBoxes*@
@for (var i = 0; i < Model.Meals.Count(); i++)
{
// Generate user interface only for valid meals
if (Model.Meals[i].MealsName != "JunkFood")
{
<div class="form-group">
@Html.Label(Model.Meals[i].MealName, htmlAttributes: new { @class = "control-label col-md-5" })
<div class="col-md-7">
<div class="checkbox">
@Html.EditorFor(x => Model.Meals[i].HasMeal)
</div>
</div>
}
@Html.HiddenFor(x => Model.Meals[i].MealId)
@Html.HiddenFor(x => Model.Meals[i].MealName)
@Html.HiddenFor(x => Model.Meals[i].HasMeal)
</div>
}
将导致:
<input name="Roles[0].HasMeals" type="hidden" value="false">
<input name="Roles[1].HasMeals" type="hidden" value="false">
<input name="Roles[2].HasMeals" type="hidden" value="false">
<input name="Roles[3].HasMeals" type="hidden" value="false">
<input name="Roles[4].HasMeals" type="hidden" value="false">
<input name="Roles[5].HasMeals" type="hidden" value="false">
但只有:
<input class="check-box" data-val="true" id="Meals_0__HasMeals" name="Meals[0].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_1__HasMeals" name="Meals[1].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_2__HasMeals" name="Meals[2].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_3__HasMeals" name="Meals[3].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_5__HasMeals" name="Meals[5].HasMeals" type="checkbox" value="true">
当点击提交按钮时,您的控制器将收到 6 个值,但 [4] 将始终为 false,因为没有任何复选框可以覆盖隐藏的输入值。
我认为这样它应该会如您所愿地工作。
绑定复选框时,如果我使用 at for next 循环并跳过一个项目,它不会绑定所有项目。
这是我的代码:
型号:
public class UserViewModel
{
public string Id { get; set; }
public string Email { get; set; }
public IList<Meal> Meals { get; set; }
}
public class Meal
{
public string MealId { get; set; }
public string MealName { get; set; }
public bool HasMeal { get; set; }
}
剃须刀:
<div class="form-group">
@Html.HiddenFor(model => model.Id)
</div>
<div class="form-group">
@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
</div>
@*Meals CheckBoxes*@
@for (var i = 0; i < Model.Meals.Count(); i++)
{
if (Model.Meals[i].MealsName == "JunkFood")
{
continue;
}
<div class="form-group">
@Html.Label(Model.Meals[i].MealName, htmlAttributes: new { @class = "control-label col-md-5" })
<div class="col-md-7">
<div class="checkbox">
@Html.EditorFor(x => Model.Meals[i].HasMeal)
</div>
</div>
@Html.HiddenFor(x => Model.Meals[i].MealId)
@Html.HiddenFor(x => Model.Meals[i].MealName)
@Html.HiddenFor(x => Model.Meals[i].HasMeal)
</div>
}
在 html 中,我得到了预期的停产 itemId...
<input name="Roles[0].HasMeals" type="hidden" value="false">
<input name="Roles[1].HasMeals" type="hidden" value="false">
<input name="Roles[2].HasMeals" type="hidden" value="false">
<input name="Roles[3].HasMeals" type="hidden" value="false">
<input name="Roles[5].HasMeals" type="hidden" value="false">
与其他控件相同
<input class="check-box" data-val="true" id="<Meals_3__HasRole" name="Meals[3].HasRole" type="checkbox" value="true">
<input class="check-box" data-val="true" id="<Meals_5__HasRolenter code here" name="Meals[5].HasRole" type="checkbox" value="true">
然后在控制器中我只得到 4 个项目而不是 5 个。
如果我在 for next 循环中取出 continue 语句,一切正常,但它显示了我想隐藏的 junkFood 复选框...
控制器
[HttpPost]
public async Task<ActionResult> Edit([Bind(Include = "Id,Email, Meals")] UserViewModel userViewModel)
{
if (ModelState.IsValid)
{
....
UserViewModel.Meals.Count 是 4
有什么提示吗?
问题是,如果您跳过 MealsName == "JunkFood" 的整个迭代,视图将不会为整个集合生成必要的输入名称。 改为这样做:
@*Meals CheckBoxes*@
@for (var i = 0; i < Model.Meals.Count(); i++)
{
// Generate user interface only for valid meals
if (Model.Meals[i].MealsName != "JunkFood")
{
<div class="form-group">
@Html.Label(Model.Meals[i].MealName, htmlAttributes: new { @class = "control-label col-md-5" })
<div class="col-md-7">
<div class="checkbox">
@Html.EditorFor(x => Model.Meals[i].HasMeal)
</div>
</div>
}
@Html.HiddenFor(x => Model.Meals[i].MealId)
@Html.HiddenFor(x => Model.Meals[i].MealName)
@Html.HiddenFor(x => Model.Meals[i].HasMeal)
</div>
}
将导致:
<input name="Roles[0].HasMeals" type="hidden" value="false">
<input name="Roles[1].HasMeals" type="hidden" value="false">
<input name="Roles[2].HasMeals" type="hidden" value="false">
<input name="Roles[3].HasMeals" type="hidden" value="false">
<input name="Roles[4].HasMeals" type="hidden" value="false">
<input name="Roles[5].HasMeals" type="hidden" value="false">
但只有:
<input class="check-box" data-val="true" id="Meals_0__HasMeals" name="Meals[0].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_1__HasMeals" name="Meals[1].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_2__HasMeals" name="Meals[2].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_3__HasMeals" name="Meals[3].HasMeals" type="checkbox" value="true">
<input class="check-box" data-val="true" id="Meals_5__HasMeals" name="Meals[5].HasMeals" type="checkbox" value="true">
当点击提交按钮时,您的控制器将收到 6 个值,但 [4] 将始终为 false,因为没有任何复选框可以覆盖隐藏的输入值。
我认为这样它应该会如您所愿地工作。