【问题标题】:.net CORE view model property of type object does not bind类型对象的.net CORE视图模型属性未绑定
【发布时间】:2019-06-15 03:38:58
【问题描述】:

我有一个 MVC Web 应用程序,我正在将其从 .net 框架移植到 .net 核心。应用程序的一部分有一个带有许多属性的视图模型,其中一个是“对象”类型。

在 .net 框架中,当我发布此视图模型数据时,控制器会毫无问题地接收它。但是,在 .net CORE 中,所有属性都包含它们的预期值,但对象除外。

如果我将类型更改为字符串大多数工作正常(但这意味着如果值曾经是一个 int(例如)它将是一个 int 的字符串表示形式)。

有人知道我如何获取作为对象类型的视图模型属性的值,或者 Core 不支持吗?

【问题讨论】:

  • 您好,您确定这已绑定在您的旧版 mvc 应用程序中吗?模型绑定器使用高级反射来确定如何将请求数据映射到属性。对于“object”类型的属性,它无法判断这是一个复杂的对象,如 Customer 对象,还是一个字符串或 int,我看不出它如何正确映射它。我没有看到遗留 mvc 映射到“对象”类型的任何示例。我觉得这可能会在 asp.net mvc 和 core 中失败。
  • @Matt,这不是真的,默认模型绑定器支持使用对象转换为大多数基本类型,例如 Bool、Int String。 (我不认为 Date 有效,但我没有尝试过)
  • @Pseudo,我认为核心还没有支持,你应该编写一个自定义绑定器,它使用 json 序列化程序来解析对象
  • @johnny5 是的,先生,我同意。我认为你误读了我的评论。我只是说它不支持绑定到类型“object”,因为它无法判断它是复杂类型还是简单类型,如 int 或 string。我在下面写了完整的答案。谢谢
  • @Matt,谢谢,我试图澄清默认模型绑定器可以绑定到类型Object,但仅适用于简单类型(Int,string bool),它可以弄清楚来自提供的 json。

标签: c# model-view-controller asp.net-core


【解决方案1】:

我真的觉得这行不通。

模型绑定使用反射将请求数据、路由数据和查询字符串映射到您的操作方法的参数中。

请求数据本质上都是字符串数据,因此 defaultmodelbinder 能够通过检查字符串是否可以无故障地转换为 int 或 bool 来将请求映射为任何简单的值类型,例如字符串、整数或布尔值。

复杂类型,如 Customer 对象,包含简单的值类型(如 string 和 int),然后也可以使用相同的方法进行映射。此处显示了这样一个复杂类型的示例:

public class Customer
{
     public string Name {get;set} 
     public bool IsLongTermCustomer {get;set;}
}

因为 defaultmodelbinder 使用反射,我真的不明白它如何知道如何映射到“对象”类型的属性,它可以是任何东西。

一个对象可能是一个客户、一个整数、一个字符串等,所以我觉得无论你使用什么版本的 MVC,这都会失败,因为我不知道 defaultmodelbinder 如何知道数据是否可以移植到对象中数据类型。这是一篇关于 MVC 核心中的模型绑定及其工作原理的详细文章。

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.2

作为额外的检查,我还会查看您是否在旧应用程序中运行 mvc 默认模型绑定器,以及是否有人没有使用自定义模型绑定器,这可能允许此绑定发生在您的旧应用程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多