如何让ASP.NET Core模型绑定器为私有setter属性赋值?
ASP.NET Core Minimal API 私有Setter模型绑定失效的解决办法
这里给你几个快速可行的方案:
方案一:构造函数绑定(推荐,适配不可变对象设计)
ASP.NET Core的模型绑定支持通过构造函数注入属性值,只要构造函数的参数名和请求体里的字段名匹配(大小写不敏感),就能自动完成绑定,属性可以保留私有setter甚至用只读自动属性。
示例代码:
public class GetDocumentRequest { public string Query { get; private set; } // 参数名和请求体的字段名对应即可 public GetDocumentRequest(string query) { Query = query; } }
这样请求体里的query字段会自动传入构造函数,完成属性赋值,不需要公共setter。
方案二:用序列化特性标记私有属性
如果不想加构造函数,可以利用序列化特性让框架识别私有setter的属性。
针对System.Text.Json(ASP.NET Core默认序列化器)
给属性加上[JsonPropertyName]特性,指定对应的JSON字段名:
using System.Text.Json.Serialization; public class GetDocumentRequest { [JsonPropertyName("query")] public string Query { get; private set; } }
针对Newtonsoft.Json(如果项目用了这个)
换成[JsonProperty]特性即可:
using Newtonsoft.Json; public class GetDocumentRequest { [JsonProperty("query")] public string Query { get; private set; } }
方案三:自定义模型绑定器(复杂场景可选)
如果以上两种方案都不满足你的需求,可以自定义模型绑定器,手动解析请求体并给私有属性赋值(可以用反射或表达式树实现),然后给GetDocumentRequest标记[ModelBinder]特性指定自定义绑定器,或者在全局配置中注册。不过一般前两种方案已经能解决大部分场景,这个作为备选。
内容的提问来源于stack exchange,提问作者user2173353
相关产品推荐
相关产品推荐

