我有一个表单,我使用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,其中一些string
和bool
类型与提交的表单字段相对应,例如:
public class Subscription {
string Email { get; set; }
string Name { get; set; }
bool Agree { get; set; }
}
问题
只要未检查表单上的复选框,WebAPI方法就能够将其他表单字段成功绑定到模型。但是,如果选中至少一个复选框,ModelState.IsValid
将返回false。
我怀疑WebAPI无法将所选复选框的on
值转换为bool
。这似乎是一个非常基本的普遍需求,所以我错过了一些简单的东西吗?
答案 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.
}