Почему мои флажки не передают свое значение моему контроллеру в ASP.NET Core?

Я чувствую, что это может быть легко исправить, но я не могу обойти это. У меня есть веб-приложение ASP.NET Core, и я использую форму ajax для отправки данных моему контроллеру для обработки. У меня проблема в том, что мои флажки всегда проходят как «ложные», даже если они могут быть проверены.

Я искал некоторые ответы, но ничего из того, что я пробовал, не сработало. Такие вещи, как использование свойства checked, обеспечивающее правильность имени.

Может ли кто-нибудь пролить свет на то, почему значения игнорируются, когда форма отправляется в контроллер, и как я могу это исправить?

Форма

<form asp-action = "CreateCustomView" asp-controller = "Data"
        data-ajax = "true"
        data-ajax-method = "POST">
        <div class = "row">
            <div class = "col">
                <div class = "custom-control custom-checkbox">                            
                    <input type = "checkbox" class = "custom-control-input" id = "ColName" name = "ColName" checked>
                    <label class = "custom-control-label" for = "ColName">Name</label>
                </div>
            </div>

            <button type = "reset">Reset</button>
            <button type = "submit">Save changes</button>
</form>

Модель

namespace MyProject.Data
{
    public class GridView : BaseEntity
    {
        public string Name { get; set; }               
        public bool ColName { get; set; }
    }
}

Контроллер данных

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MyProject.Data;
using Microsoft.AspNetCore.Mvc;

namespace MyProject.UI.Controllers
{
    public class DataController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult CreateCustomView(GridView data)
        {
            //This method is incomplete, there is a break at the ActionResult to see what values are passed into `data`.  In production, the values would be handled and the changes would be saved.
            return View();
        }
    }
}

У меня есть точка останова в методе CreateCustomView, чтобы увидеть, какие значения передаются, независимо от того, какие флажки я проверяю, они всегда передаются как false.

Может ли кто-нибудь помочь с этой довольно странной проблемой?

Обновлять

Согласно ответу, предоставленному @Reyan-Chougle, если вы используете CORE, вам необходимо ввести следующие данные:

<input asp-for = "@Model.ColType" type = "checkbox" />

Когда страница визуализируется, элемент управления автоматически получает скрытое поле. Вот как выглядит HTML-код вышеприведенного элемента управления:

<input type = "checkbox" class = "custom-control-input" id = "ColType" value = "true" data-val = "true" data-val-required = "The ColType field is required." name = "ColType">
<input type = "hidden" value = "false" id = "ColType" name = "ColType">

Как видите, он создает скрытый флажок со значением false. Это означает, что как логический тип он всегда имеет значение true или false при отправке.

потому что неотмеченные флажки не публикуются браузером. вы должны опубликовать дополнительное скрытое поле, см. stackoverflow.com/questions/1809494/… и stackoverflow.com/questions/2697299/…

Joe Audette 17.07.2019 17:19

Возможно ли, что вы публикуете их как application/x-www-form-urlencoded, когда приложение ожидает application/json?

codeMonkey 17.07.2019 17:25

Вы нашли какое-нибудь решение?

Reyan Chougle 22.07.2019 11:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
10 846
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вы не используете атрибут asp-for, вы можете изменить свои коды, чтобы добавить скрытое поле. Он будет отправлен независимо от того, установлен флажок или нет. Если флажок установлен, опубликованное значение будет истинным, ложным. Связыватель модели будет правильно извлекать true из значения. В противном случае будет ложно:

<input type = "checkbox" class = "custom-control-input" data-val = "true" id = "ColName" name = "ColName" value = "true" checked>
<label class = "custom-control-label" for = "ColName">Name</label>
<input name = "ColName" type = "hidden" value = "false">
Ответ принят как подходящий

Поскольку вы используете ASP.NET Core, рекомендуется использовать Помощники по тегам:

<div class = "form-group">
    <label asp-for = "@Model.ColName"></label>
    <input asp-for = "@Model.ColName" type = "checkbox" />
</div>

Я столкнулся с похожей проблемой. У нас есть форма, которая содержит множество полей, включая текстовые поля, меню выбора (выпадающее меню), флажки и, конечно же, метки. Все поля правильно сохраняются в базе данных, ЗА ИСКЛЮЧЕНИЕМ трех имеющихся у нас флажков. Я только что понял, как это исправить, после того, как несколько недель возился с ним время от времени. Я надеюсь, что это поможет кому-то:

Вот как выглядел код:

$(this).attr('data-val', 'true');

Вот что устранило проблему:

$(this).val(true);

Вот вся функция, которая включает в себя исправление:

$('form').on('change', ':checkbox', function () {
    if (this.checked) {
        $(this).val(true);
    }
    else {
        $(this).val(false);
    }
});

попробуй использовать

 @Html.CheckBox("ColName", true)   

Другие вопросы по теме