代码不作为扩展程序工作,但以其他方式工作

时间:2015-05-22 17:14:24

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

在MVC视图中,我有以下内容:

@(Newtonsoft.Json.JsonConvert.SerializeObject(Model))

@(Model.ConvertToJson())

第一个适用于类和IPagedList

第二个适用于类,但不适用于Model是IPagedList

ConvertToJSon扩展程序如下:

public static class ObjectExtensions {
  public static String ConvertToJson<T>(this T obj) {       
    return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
  }
}

知道为什么吗?

更新1

这真的很奇怪。当模型的类型是:

PagedList<MyModel>

我用:

@Model.ConvertToJson()

我收到错误:

'PagedList<MyModel>' does not contain a definition for 'ConvertToJson'

然后我尝试了以下

 @(new { Model = Model }.ConvertToJson()))

现在它有效...... ConvertToJson是:

public static class ObjectExtensions {
  public static String ConvertToJson(this Object obj) {       
    return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
  }
}

有任何线索吗?

更新2

似乎铸造工作:

((Object)Model).ToJson())

奇怪,不是吗?

1 个答案:

答案 0 :(得分:3)

<强>更新

如果您遇到运行时异常,例如:

  

CS0012:类型&#39; System.Object&#39;在一个不是的程序集中定义   引用。您必须添加对程序集&System; System.Runtime的引用,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a&#39;。

您需要将主web.config的compilation部分扩展为以下内容:

<compilation debug="true" targetFramework="4.5">
  <assemblies>
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, 
        PublicKeyToken=b03f5f7f11d50a3a" />
  </assemblies>
</compilation>

该扩展程序适用于IPagedList类型的模型。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new PagedList<string>(
            new List<string> { "test1", "test2"}, 1, 2 ));
    }
}

@model PagedList.IPagedList<string>
@(Model.ConvertToJson())

此语法编译并运行时没有错误,输出:

["test1","test2"]

这也适用于IPagedList<ComplexType>

return View(new PagedList<Test>(new List<Test>
{
    new Test {Id = 1, Name = "test1"},
    new Test {Id = 2, Name = "test2"}     
}, 1, 2));

[{"Id":1,"Name":"test1"},{"Id":2,"Name":"test2"}]

最后,@Model.ConvertToJson()@(Model.ConvertToJson())不同。

第一个将在运行时失败,第二个将起作用。

确保您已清理并重建了解决方案。

因为它不是正确的扩展方法语法。

public static class ObjectExtensions {
    public static String ConvertToJson<T>(this T obj) {       
        return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
    }
}
参数的Type声明之前的

this告诉编译器它是一个扩展方法。

MSDN