将Json对象作为System.object或Interface类型的对象传递不起作用
本文关键字:对象 类型 不起作用 Interface object Json System | 更新日期: 2023-09-27 17:53:53
类别:
公共类ClassNameA:ISomeInterface{}公共类ClassNameB:ISomeInterface{}
来自javascript:
var reqP = { 'Id': id, 'Name':name };
var ReqParams = { 'ReqParams': reqP };
var obj = { 'ClassNameA': ReqParams };
makeAjaxCall("POST",
JSON.stringify(obj), '/ControllerName/someMethod/', 'html',
操作方法看起来像:
public ActionResult someMethod(object obj){
// call comes to this method but obj is not populated.
}
public ActionResult someMethod(ISomeInterface obj){
// call comes to this method but throws exception.
// Exception : Cannot instantiate interface. but i am passing class object.
}
从JavaScript中,我将传递实现ISomeInterface
的具体类类型的对象,这样我就可以有多个实现。混凝土等级可以是这两种类型中的任何一种。
有什么建议吗?
那行不通。模型绑定器需要一个具体类型才能创建实例并绑定值。
object
是一个具体类型,可以使用Activator.CreateInstance
创建,但它没有任何与您接收的数据匹配的属性。
无法创建接口(或抽象类型(,因为它们不是具体类型。就这么简单。
如果JSON包含一些关于类型的提示,则可能实现一个自定义模型绑定器来为您创建实例。您可以在此处阅读有关模型绑定过程的更多信息。
默认的模型绑定器将无法确定该做什么。让我们通过一些示例接口来了解原因。假设你有这个:
public ActionResult SomeMethod(ISomeInterface obj)
{
// ...
}
并假设您有以下两种实现:
class ClassA : ISomeInterface
{
public string Name { get; set; }
public string Phone { get; set; }
}
class ClassB : ISomeInterface
{
public string Name { get; set; }
public string Email { get; set; }
}
并说这个JSON发布了:
{ "Name": "Some Value" }
模型绑定器如何知道要使用哪个类?它会在所有程序集中搜索所有定义的类来查找接口的所有实现吗?如果是这样的话,即使它有基于属性的智能选择逻辑,它将如何在两者兼容的ClassA
或ClassB
之间进行选择?
您可能想要做的是使用像Dictionary<string, object>
这样的类型,您知道它是兼容的dynamic
,或者使用一个具体的类,它是您所需要的一切的并集。或者,您可以创建一个自定义模型绑定器,该绑定器具有自己的逻辑,用于选择要实例化的类。有关详细信息,请参阅此问题。