首页 > 解决方案 > 使用复选框将数据从视图发布到控制器

问题描述

我有以下课程:

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:不允许方法,果然,不要获取数据。

如何将复选框中的数据接收到控制器中?

标签: c#asp.netasp.net-mvcasp.net-corepost

解决方案


[FromBody]表示您正在发送类似application/jsonor的内容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>

推荐阅读