gpt4 book ai didi

asp.net-mvc-4 - 自定义 MediaTypeFormatter,为什么是 IKeyValueModel 而不是我的模型类型?

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

我正在尝试自定义实现 MediaTypeFormatter , 但方法 bool CanReadType(Type type)总是以 IKeyValueModel 类型调用,而不是我的类型 MyProduct .

在我的 API Controller 中,我有:

[HttpPost]
public Task Save(MyProduct product)

我看过一些例子( example 1example 2 ),我也试过代码:
protected override bool CanReadType(Type type)
{
if (type == typeof(IKeyValueModel))
return false;
return true;
}

但后来我得到一个“MissingMethodException:没有为此对象定义无参数构造函数”,因为我的模型类型没有无参数构造函数。所以看起来像因为 CanReadType返回 false 到 IKeyValueModel ,框架使用另一种媒体类型格式化程序。实际上,方法 OnReadFromStreamAsync永远不会被击中。

我希望能够控制我的模型如何反序列化,我想获得真实的类型而不是 IKeyValueModel .

这已经在带有模型绑定(bind)器的 MVC 中运行良好。

干杯。

2012 年 5 月 29 日更新:

如果我删除默认的 json 格式化程序,它可以工作:
    public static void RegisterApis(HttpConfiguration config)
{
config.Formatters.Clear();

但是我想保留两者,我怎么能指出我想使用哪一个?

问候。

最佳答案

如果您需要控制序列化,最好使用 Json.NET 的灵 active 功能(参见 hereherehere )来控制而不是为此编写媒体类型格式化程序。

Json.NET now是 ASP.NET Web API 中的默认格式化程序。

更新

My objects don't have parameterless constructors and the properties are readonly. I have also objects that inherit from DynamicObject, so let's say that my business entities are not trivial.



我可能会告诉你如何在脚上开枪。但我宁愿解释如何避免出现这些问题,因为我相信你遇到了这些问题,因为你的方法中有反模式。

首先,您要寻找的不是另一种媒体类型格式化程序。你需要一个不同的序列化器或者只需要配置你的序列化器。

但更重要的是,将您的业务实体直接序列化给客户端并不是一个好主意。我们需要在这里称为 View 模型的 DTO。这样的类只是状态持有者,没有逻辑,没有魔法。序列化它们应该没有问题。

您可以使用 AutoMapper 等将您的实体映射到 View 模型,而无需更多的开发成本。 始终建议从表示层抽象出您的域模型。

关于asp.net-mvc-4 - 自定义 MediaTypeFormatter,为什么是 IKeyValueModel 而不是我的模型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10784217/

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