簡體   English   中英

asp.net core 2.2中嵌套屬性的模型綁定

[英]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 的技巧,但它使得兩個嵌套屬性不可能具有相同的類型。

UDPATE:

我知道添加完全限定的屬性名稱( .../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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM