gpt4 book ai didi

c# - asp.net core 2.2中嵌套属性的模型绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 15:52:44 27 4
gpt4 key购买 nike

我正在尝试为我的模型( Action 参数)创建一个通用的复杂对象,并在许多地方重用它。

下面是一些示例代码:

[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 的技巧,但它使得两个嵌套属性不可能具有相同的类型。

UDPATE:

我知道添加完全限定的属性名称 (.../values?Id=1&Generated.DateInfo=2&Reference.DateInfo=3) 会使其工作,但这将是调用任何 API 的一种非常丑陋的方式。连字符是方式,而不是点。

我想以与映射常规属性相同的方式映射绑定(bind)。

如何做到这一点?

最佳答案

我看到两个选项。

选项 1:只需创建一个新的扁平化类 {Id, Foo, Bar}用作操作方法的参数。然后您可以将其映射到 MyModel。这是我推荐的最易于维护的方法。

选项 2:自定义模型绑定(bind),如下:

[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 您可以合理地编写一些反射来获取嵌套模型的所有叶属性名称。

关于c# - asp.net core 2.2中嵌套属性的模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53181095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com