Я чувствую, что это может быть легко исправить, но я не могу обойти это. У меня есть веб-приложение 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 при отправке.
Возможно ли, что вы публикуете их как application/x-www-form-urlencoded, когда приложение ожидает application/json?
Вы нашли какое-нибудь решение?





Если вы не используете атрибут 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)
потому что неотмеченные флажки не публикуются браузером. вы должны опубликовать дополнительное скрытое поле, см. stackoverflow.com/questions/1809494/… и stackoverflow.com/questions/2697299/…