Почему мой флажок не возвращает текстовое свойство - PullRequest
1 голос
/ 10 июля 2020

Итак, у меня есть эта форма с этим внутри

<div class="form-group">
    @*<div class="form-check form-check-box">


    @for (int i = 0; i < Model.Features.Count; i++)
    {
        <div class="form-check form-check-box">
            <input class="form-check-input" type="checkbox" asp-for="@Model.Features[i].Selected" value="@Model.Features[i].Text">
            <label class="form-check-label" asp-for="@Model.Features[i].Text">@Model.Features[i].Text</label>
        </div>
    }
</div>

И когда я отправляю форму и проверяю свойства SelectedListItem, она выглядит так

введите описание изображения здесь

Хотя Selected должно быть True, потому что я это проверил. Все остальное, что находится в форме, публикуется нормально, например, ввод текста прекрасно связывается со свойством String Text внутри моей ProductModel, я считаю, что проблема заключается в том, как я использую свойства элемента флажка.

Итак Я вижу флажки, и я могу их проверять, et c, но когда я публикую форму, ничего, связанное с флажками, не применяется к ProductModel

public class ProductModel
{
    public string Title { get; set; }
    public IList<SelectListItem> Features { get; set; }
}

Вот как я показываю установку модели для представления

public IActionResult PostAd()
{
    var model = new ProductModel
    {
        Features = new List<SelectListItem>()
        {
            new SelectListItem { Text = "Camera", Value = "Camera" },
            new SelectListItem { Text = "Touch Screen", Value = "Touch Screen" }
        }
    };

    return View(model);
}

Как правильно использовать флажки, чтобы при публикации формы данные поступали в модель? Это действие, которое запускается при публикации

[HttpPost]
public IActionResult CreateAd(ProductModel Product)
{
    return View("Index");
}

1 Ответ

1 голос
/ 11 июля 2020

Проблема, с которой вы столкнулись, заключается в том, что при отправке формы ASP. NET привяжет опубликованные данные к вашей модели, но отправляются только введенные значения в форме. Причина, по которой ваш SelectListItem имеет свойства null Text и Value, заключается в том, что эти значения не публикуются в форме. Форма должна содержать ввод (например, скрытый ввод) для @Model.Features[i].Text и другой для @Model.Features[i].Value, чтобы они были связаны обратно с SelectListItem во время привязки модели, потому что это вход name, который связывает его к собственности модели. Но имейте в виду, что получение их даже от скрытых входов позволит пользователю изменить их на любое значение, которое он хочет, поэтому вам нужно будет проверить на стороне сервера, что они 1) допустимые значения и 2) разрешено выбирать.

Учитывая этот факт, я считаю, что имеет больше смысла просто перезагрузить список доступных опций, в вашем случае Features, в вашем действии HttpPost, а затем обновить этот перестроенный список с помощью представленных пользователем выборов.

Теперь осталась единственная проблема в том, что вы даже не получаете Selected значение true. Это снова, потому что это основано на вводе (флажке) value. asp-for="@Model.Features[i].Selected" присвоит флажку значение name, необходимое для его обратной привязки к этому свойству, и привяжет его атрибут value к значению Selected. Однако затем вы также определяете свой собственный атрибут value как value="@Model.Features[i].Text", который переопределяет тот, который был бы сгенерирован помощником asp-for. Поэтому, когда ваша форма отправлена, связыватель модели пытается привязать "Camera" к логическому свойству Selected, что невозможно, поэтому он просто получает значение по умолчанию false. Как правило, для ввода раскрывающегося списка (<select>) используется SelectListItem. Нет причин, по которым вы не можете использовать его для этой цели, но вы также можете просто использовать свой собственный тип модели для флажков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...