在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())
奇怪,不是吗?
答案 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
告诉编译器它是一个扩展方法。