【问题标题】:Model binding for nested inherited objects .Net core嵌套继承对象的模型绑定.Net核心
【发布时间】:2021-12-02 20:57:09
【问题描述】:

是否可以为嵌套的继承对象创建自定义模型绑定器? 看到这篇文章https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-5.0,但是我的情况比较难,我的对象很复杂。

例如,我有这个简单的结构:

一级

public class Top
{
    public string Value { set; get; }

    public IEnumerable<MiddleBase> MiddleClasses { set; get; }
}

二级

public abstract class MiddleBase
{
    public ConcreteMiddleType Type { set; get; }

    public IEnumerable<BottomBase> BottomClasses { set; get; }
}

public class ConcreteMiddle1 : MiddleBase
{
    public string Value1 { set; get; }
}

public class ConcreteMiddle2 : MiddleBase
{
    public string Value2 { set; get; }
}

第三级

public abstract class BottomBase
{
    public ConcreteBottomType Type { set; get; }
}

public class ConcreteBottom1 : BottomBase
{
    public string Value1 { set; get; }
}

public class ConcreteBottom2 : BottomBase
{
    public string Value2 { set; get; }
}

如果我处理请求我得到错误,我不能绑定基抽象类。

有人遇到过此类问题吗?

【问题讨论】:

  • 有点道理,因为你不能实例化抽象类。一种可能的(天真的)解决方案可能是维护您的具体类型的列表。但我想这有点违背继承的目的,因为每次添加类型时,都需要添加一个列表,以及一些将正确元素放入列表的代码。老实说,我认为您最好在将数据传递给视图并将所有对象映射到某种视图模型时删除整个继承内容,该视图模型包含所有实现的所有属性和鉴别器
  • 最好能提供更多关于如何在控制器中使用这些类的详细信息

标签: c# asp.net-core model-binding custom-model-binder


【解决方案1】:

如果您真的希望您的基类是抽象的,您可以创建一个自定义 ModelBinder 并使用 bindingContext.MetaData 覆盖基类的处理方式。这是一个例子:

MVC 3 Model Binding a Sub Type (Abstract Class or Interface)

编辑:在 .net core 中,模型绑定器需要扩展 IModelBinder 接口,并且在启动时配置服务时需要注册自定义 IModelBinderProvider。 IModelBinderProvider 将检查您的模型类型并在其 GetBinder 函数中传递您的 IModelBinder。从您的自定义 IModelBinder 中,您可以访问 bindingContext,它具有反序列化视图模型的抽象成员所需的一切。

Replacing DefaultModelBinder in ASP.net MVC core

【讨论】:

  • 感谢您的建议。如果我是对的,.net core 有不同的绑定机制,并且 .net core 中没有 DefaultModelBinder
  • 似乎您可以实现 IModelBinder 和 IModelBinderProvider ,它们将为您的类类型传递您的自定义模型绑定器。在这种情况下,您仍然可以像前面的示例一样访问 bindingContext。这里有类似的东西:stackoverflow.com/questions/50893324/…
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多