ASP. NET MVC 5 не получает все элементы в связанном флажке при пропуске одного элемента - PullRequest
0 голосов
/ 21 февраля 2020

При установке флажков, если я использую at для следующего l oop и пропускаю один элемент, он не связывает все элементы.

Вот мой код:

Модель:

 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 я получаю более снятый товар ожидается ...

<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.

Если я уберу оператор continue в следующем l oop все работает, но показывает флажок junkFood, который я хочу скрыть ...

Controller

[HttpPost]
public async Task<ActionResult> Edit([Bind(Include = "Id,Email, Meals")] UserViewModel userViewModel)
{
    if (ModelState.IsValid)
    {
          ....

UserViewModel.Meals.Count равен 4

Есть подсказки?

1 Ответ

0 голосов
/ 21 февраля 2020

Проблема в том, что если вы пропустите всю итерацию для 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] всегда будет ложным, поскольку нет никакого флажка, который мог бы переопределить скрытое входное значение.

Таким образом, это должно работать, как вы ожидаете, я думаю.

...