如何将ASP.NET Core WebAPI方法绑定到模型的布尔字段?

时间:2017-01-01 19:19:36

标签: jquery asp.net-web-api asp.net-core asp.net-core-mvc

我有一个表单,我使用JQuery发布到我的WebAPI端点:

<form>
  Email: <input type="email" name="email" /><br>
  Name: <input type="text" name="name" /><br>
  <input type="checkbox" name="agree" /> I wish to subscribe
</form>

...

function Subscribe() {
    $.ajax({
        url: "api/Subscription/subscribe",
        method: "POST",
        data: $("#SubscriptionForm").serialize()
    })
    .done(function() { alert("yay!"; })
    .fail(function() { alert(":("); });
}

正如所料,这是以application/x-www-form-urlencoded形式提交表单(例如email=me@domain.com&name=Joe&agree=on)。在接收端,我的API方法如下所示:

[HttpPost("subscribe", Name = "Subscribe")]
public IActionResult Subscribe(Subscription subscription) {
    if(!ModelState.IsValid) {
        return BadRequest();
    }
    SubscriptionRepository.Create(subscription);
    return Ok();
}

Subscription是一个POCO,其中一些stringbool类型与提交的表单字段相对应,例如:

public class Subscription {
   string Email { get; set; }
   string Name { get; set; }
   bool Agree { get; set; }
}

问题

只要未检查表单上的复选框,WebAPI方法就能够将其他表单字段成功绑定到模型。但是,如果选中至少一个复选框,ModelState.IsValid将返回false。

我怀疑WebAPI无法将所选复选框的on值转换为bool。这似乎是一个非常基本的普遍需求,所以我错过了一些简单的东西吗?

2 个答案:

答案 0 :(得分:1)

如果该复选框具有value属性,则会在提交表单时将其发布(并选中复选框)。如果未选中该复选框,并且您尝试提交表单,则系统不会提交该项目,因此您的boolean媒体资源将获得默认值false

如果复选框没有值属性,那么当您选中复选框并提交表单时,将发送值"on"(即发生的事情),如果未选中复选框,什么都不会发送给那个元素。

只需将value="true"添加到您的html中即可显示复选框。

<form id="SubscriptionForm">
    Email: <input type="email" name="email" /><br>
    Name: <input type="text" name="name" /><br>
    <input type="checkbox" value="true" name="agree" /> I wish to subscribe
    <input id="submit" type="submit" />
</form>

此外,您需要确保您的属性为public,否则模型绑定器将无法设置这些属性的值!

public class Subscription 
{
   public string Email { get; set; }
   public  string Name { get; set; }
   public  bool Agree { get; set; }
}

答案 1 :(得分:0)

尝试使用以下方法捕获错误:

if (!ModelState.IsValid)
{
    var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

    // Breakpoint, examine the list with Exceptions.
}