c# - 使用复选框将数据从视图发布到控制器
问题描述
我有以下课程:
public class Entidade
{
public string Voz { get; set; }
public bool Valor { get; set; }
}
我用控制器生成视图(GET):
public IActionResult Entidade()
{
var model = GetVoidEntidade.Entidades();
return View(model);
}
GetVoidEntidade.Entidades() 将生成一个包含 5 行的“Entidade”列表,其中每行都有一个“Entidade”,其中“Voz”和“Val”的唯一字符串将为 false。
风景:
<form asp-action="Entidade">
@{
int i = 0;
}
@foreach (var entidade in Model)
{
var name = $"Valor[{i++}]";
<input type="checkbox" value="@entidade.Valor" class="form-check-input" name=@name />@entidade.Voz<br />
}
<div class="form-group">
<input type="submit" value="Próximo" class="btn btn-success align-content-end float-md-right" />
</div>
</form>
POST 控制器就在那里,这样我就可以通过调试器选择返回:
[HttpPost]
public IActionResult Entidade([FromBody]IEnumerable<Entidade> model)
{
var boh = Request.Form.Files;
return View();
}
当我运行它并尝试执行 POST 时,我收到一条错误消息 405:不允许方法,果然,不要获取数据。
如何将复选框中的数据接收到控制器中?
解决方案
[FromBody]
表示您正在发送类似application/json
or的内容application/xml
。HTML 表单以x-www-form-urlencoded
或形式发送multipart/form-data
。从动作参数中删除[FromBody]
属性。这解决了您当前的问题,但之后,您将得到一个空模型,因为您的输入名称不正确。
首先,您需要使用 afor
而不是 a foreach
,因为您需要为列表编制索引。其次,您当前生成的名称甚至都不正确。它需要类似于:索引[N].Valor
在哪里。N
第三,您应该只使用标签助手,因此您甚至不需要考虑它。换句话说,您的代码应该是:
<form asp-action="Entidade">
@for (var i = 0; i < Model.Count; i++)
{
<input asp-for="@Model[i].Valor" type="checkbox" class="form-check-input" />
@entidade.Voz<br />
}
<div class="form-group">
<button type="submit" class="btn btn-success align-content-end float-md-right">Próximo</button>
</div>
</form>
推荐阅读
- jquery - 如何使用 velo 在表单中插入元素
- java - 如何将数据从 Nodejs 程序传输到 Java 程序?
- c# - C# - 如何根据代码列表对两个值求和
- javascript - 从数组中删除重复的对象但也会增加数量
- gnuplot - 背景颜色 - 图表消失
- flutter - 当 Draggable 子项的状态发生变化时如何更新 DragTarget?
- javascript - split.js 在 Rails 6 中导致“Uncaught TypeError: Splitting is not a function”
- json - 尝试使用jq在一行上格式化json数据
- python - 如何摆脱 Google Colab 中的以下错误 - 超出 IOPub 数据速率
- clojure - 语法错误 (FileNotFoundException) 无法在类路径上找到 [name].class、[name].clj 或 [name].cljc