【问题标题】:Pass Json object as object of type System.Object or Interface not working将 Json 对象作为 System.Object 类型的对象传递,或者接口不起作用
【发布时间】:2014-03-26 18:04:57
【问题描述】:

类:

公共类 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 的具体类类型的对象,以便我可以有多个实现。具体类可以是这两种类型中的任何一种。

有什么建议吗?

【问题讨论】:

  • 你需要一个定义好的模型作为参数。
  • 然后它与定义的模型类型紧密耦合。我不要那个。所以如果我使用泛型类型,那么我可以在转换后使用它来基于对象类型进行特定的实现。

标签: c# javascript asp.net asp.net-mvc json


【解决方案1】:

那是行不通的。模型绑定器需要一个具体类型才能创建实例并绑定值。

object 是一个具体类型,可以使用Activator.CreateInstance 创建,但它没有任何属性可以匹配您收到的数据。

无法创建接口(或抽象类型),因为它们不是具体类型。就这么简单。

如果 JSON 包含有关类型的一些提示,则可以实现自定义模型绑定器来为您创建实例。你可以阅读更多关于模型绑定过程here

【讨论】:

  • 是的,json 对象有类类型的信息。当我查看 firbug 时,它会向我显示具有具体类名和填充属性的对象。所以我想使用反射来获取类型(object.getType()),然后创建它的实例并执行其余功能。跨度>
【解决方案2】:

默认模型绑定器将无法弄清楚要做什么。让我们通过一些示例界面来完成练习以说明原因。假设你有这个:

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" }

模型绑定器如何知道要使用哪个类?它会搜索所有程序集中的所有已定义类以查找接口的所有实现吗?如果是这样,即使它具有基于属性的智能选择逻辑,它如何在两者兼容的ClassAClassB 之间进行选择?

您可能想要做的是使用像Dictionary<string, object> 这样您知道将兼容的类型dynamic,或者使用作为您需要的所有东西的联合的具体类。或者,您可以使用自己的逻辑创建自定义模型绑定器,以选择要实例化的类。详情请见this question

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 2013-04-22
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多