Asp.net core 模型绑定 在 ASP.NET Core 中模型绑定Model Binding是将 HTTP 请求中的数据如路由参数、查询字符串、请求体等自动映射到控制器 Action 方法参数的过程。当多个数据源中存在同名参数时框架会按照一个固定的优先级顺序来决定使用哪个值。 默认绑定源优先级ASP.NET Core 的模型绑定器会按照以下顺序依次查找数据并使用第一个找到的值。表单值 (Form values)来自application/x-www-form-urlencoded或multipart/form-data请求的表单字段。路由值 (Route values)来自 URL 路由模板中定义的参数例如/api/products/{id}中的id。查询字符串 (Query string)来自 URL 中?后面的键值对例如/api/products?id5。请求体 (Request body)来自application/json、application/xml等格式的请求体内容。特别注意对于复杂类型如自定义的类对象默认情况下会从请求体中绑定。核心规则一旦在某个源中找到了匹配的参数名绑定过程就会停止后续优先级较低的源中即使有同名参数也会被忽略。 代码示例假设有以下控制器和 Action[ApiController][Route(api/[controller])]publicclassProductsController:ControllerBase{// GET /api/products/5?price100[HttpGet({id})]publicIActionResultGetProduct(intid,intprice){// 此时 id 5 (来自路由), price 100 (来自查询字符串)returnOk(new{Idid,Priceprice});}}现在我们通过一个 POST 请求来演示优先级冲突请求:POST /api/products/99?price50 Content-Type: application/x-www-form-urlencoded price200id88模型绑定结果:id参数首先在表单值中查找找到id88。绑定成功id的值为88。路由中的99被忽略。price参数首先在表单值中查找找到price200。绑定成功price的值为200。查询字符串中的50被忽略。最终Action 方法接收到的参数是id88和price200。️ 使用特性控制绑定源你可以使用[From...]系列特性来显式指定参数的绑定源这会覆盖默认的优先级规则。特性说明[FromForm]强制从表单值中绑定。[FromRoute]强制从路由值中绑定。[FromQuery]强制从查询字符串中绑定。[FromBody]强制从请求体中绑定。[FromHeader]从请求头中绑定。[FromServices]从依赖注入容器中解析服务。示例// GET /api/products/5?price100[HttpGet({id})]publicIActionResultGetProduct([FromRoute]intid,// 明确指定从路由绑定[FromQuery]intprice)// 明确指定从查询字符串绑定{// ...}在这种情况下即使请求中包含同名的表单字段id和price也只会从指定的源路由和查询字符串获取值。如果指定的源中不存在该参数则会绑定失败对于非可空类型会报错。