[英]Model binding of nested properties in asp.net core 2.2
我正在嘗試為我的模型(動作參數)創建一個通用的復雜對象,並在許多地方重用它。
下面是一些示例代碼:
[HttpGet("/api/values")]
public ActionResult<string> Get([FromQuery] MyModel model) {
var sb = new StringBuilder();
sb.AppendLine(model.Id);
sb.AppendLine($"{model.Id}-{model.Generated?.DateStart}-{model.Generated?.DateEnd}");
sb.AppendLine($"{model.Id}-{model.Reference?.DateStart}-{model.Reference?.DateEnd}");
return sb.ToString();
}
public class MyModel {
public string Id { get; set; }
public DateInfo Generated { get; set; } = new DateInfo();
public DateInfo Reference { get; set; } = new DateInfo();
}
public class DateInfo {
public DateTime? DateStart { get; set; }
public DateTime? DateEnd { get; set; }
public RelativeTime? RelativeTime { get; set; }
}
想象一下 DateInfo 類將具有要在許多模型中使用的驗證和通用屬性。
將[FromQuery(Name = "Something")]
到嵌套屬性中可以實現 swagger 的技巧,但它使得兩個嵌套屬性不可能具有相同的類型。
我知道添加完全限定的屬性名稱( .../values?Id=1&Generated.DateInfo=2&Reference.DateInfo=3 )會使其工作,但這將是調用任何 API 的一種非常丑陋的方式。 連字符是方式,而不是點。
我想以與映射常規屬性相同的方式映射綁定。
如何做到這一點?
我看到兩個選項。
選項 1:只需創建一個新的扁平化類{Id, Foo, Bar}
用作操作方法的參數。 然后您可以將其映射到 MyModel。 這是我推薦的最易於維護的方法。
方案二:自定義模型綁定,如下:
[ModelBinder(BinderType = typeof(MyModelBinder))]
public class MyModel
{
public string Id { get; set; }
[FromQuery]
public Info ComplexNestedProperty { get; set; }
}
public class AuthorEntityBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var model = new MyModel
{
Id = bindingContext.ValueProvider.GetValue("id"),
ComplexNestedProperty = new Info
{
Foo = bindingContext.ValueProvider.GetValue("foo"),
Bar = bindingContext.ValueProvider.GetValue("bar")
}
};
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
作為選項 2的擴展,您可以合理地編寫一些反射來獲取嵌套模型的所有葉屬性名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.