我在使用ASP.NET Core的model binding时遇到了麻烦。基本上,我只是想将一些POSTed json绑定到具有嵌套属性的对象模型。下面为单个按钮提供了最少的代码,按下该按钮将通过XMLHttpRequest将其发布到Controller动作方法。 action方法采用具有[FromBody]
属性的单个模型类参数。
型号:
public class OuterModel {
public string OuterString { get; set; }
public int OuterInt { get; set; }
public InnerModel Inner { get; set; }
}
public class InnerModel {
public string InnerString { get; set; }
public int InnerInt { get; set; }
}
控制器:
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller {
[HttpPost("models/")]
public IActionResult Save([FromBody] OuterModel viewModel) {
if (!ModelState.IsValid)
return BadRequest(ModelState);
// Return an appropriate response
return Ok();
}
}
“提交”按钮的剃刀标记:
<div class="form-row">
<div class="col-2">
@{ string url = Url.Action(nameof(HomeController.Save), "Home"); }
<button id="post-btn" data-post-url="@url">POST</button>
</div>
</div>
要提交的JavaScript(不绑定):
document.getElementById("post-btn").addEventListener("click", e => {
const xhr = new XMLHttpRequest();
xhr.addEventListener("timeout", () => console.error("Timeout"));
xhr.addEventListener("error", () => console.error("Error"));
xhr.addEventListener("load", () => console.log(`Status: ${xhr.status} ${xhr.statusText}`));
xhr.open("POST", e.target.dataset.postUrl);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify({
"OuterString": "outer",
"OuterInt": 1,
"Inner.InnerString": "inner",
"Inner.InnerInt": 5
}));
});
看看该JavaScript,我希望Inner.*
json属性名能够正确绑定,因为docs的这一行:
模型绑定查找模式 parameter_name.property_name 将值绑定到属性。如果找不到此形式的匹配值,它将尝试仅使用属性名称进行绑定。
但事实并非如此; action方法中的OuterModel.Inner
属性以null
结尾。但是,以下json 正确绑定了
要提交的JavaScript(绑定DOES):
xhr.send(JSON.stringify({
"OuterString": "outer",
"OuterInt": 1,
"Inner": {
"InnerString": "inner",
"InnerInt": 5
}
}));
因此,我可以使用此代码来实现所需的模型绑定,我对于第一个JavaScript 没有起作用的原因感到困惑。嵌套属性是否使用了正确的命名约定?一些澄清将不胜感激!