我刚刚将JSON.NET添加到我的项目中,我想创建一个名为JsonNet的扩展方法,其行为与Json方法相同,但使用的是JSON.NET。
我这里有一个使用JSON.NET扩展JsonResult的类:
public class JsonNetResult : JsonResult {
public override void ExecuteResult(ControllerContext context) {
if (context == null)
throw new ArgumentNullException("context");
var response = context.HttpContext.Response;
response.ContentType = !String.IsNullOrEmpty(ContentType)
? ContentType
: "application/json";
if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding;
var serializedObject = JsonConvert.SerializeObject(Data, Formatting.Indented);
response.Write(serializedObject);
}
}
在ExecuteResult方法下面,我尝试添加以下内容:
public static JsonNetResult JsonNet(this Controller controller, object data) {
var result = new JsonNetResult();
result.Data = data;
return result;
}
public static JsonNetResult JsonNet(this Controller controller, object data, JsonRequestBehavior behavior) {
var result = new JsonNetResult();
result.Data = data;
result.JsonRequestBehavior = behavior;
return result;
}
然后我有我的控制器:
public class SomethingController : Controller {
public ActionResult SomeAction() {
object data = SomeClass.GetData();
return JsonNet(data, JsonRequestBehavior.AllowGet);
}
}
编译器无法找到JsonNet方法。即使我尝试这个:
return ((Controller)this).JsonNet(data, JsonRequestBehavior.AllowGet);
它仍然不起作用。
如果我将JsonNet中的代码复制到SomeAction中,它可以正常工作,所以我知道SomethingController可以看到JsonNetResult。
如果有帮助,这两个类位于不同的名称空间中。
答案 0 :(得分:2)
这是我现在使用的那个,它也对我从中提取一些来源的页面有评论。我已经对自己进行了调整,包括扩展方法。
如上所述,您需要在控制器中添加适当的using命名空间。
我只是使用return this.JsonNet(data)
来调用它。我只是允许自定义格式化的覆盖,还有一个因为我遇到了需要内容类型为“普通/文本”的JS插件。
//http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx
public class JsonNetResult : ActionResult
{
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; }
public object Data { get; set; }
public JsonSerializerSettings SerializerSettings { get; set; }
public Formatting Formatting { get; set; }
public JsonNetResult()
{
SerializerSettings = new JsonSerializerSettings
{
//http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx
#if DEBUG
Formatting = Formatting.Indented, //Makes the outputted Json for structures for easier reading by a human, only needed in debug
#endif
ContractResolver = new CamelCasePropertyNamesContractResolver() //Makes the default for properties outputted by Json to use camelCaps
};
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = !string.IsNullOrEmpty(ContentType)
? ContentType
: "application/json";
if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding;
if (Data != null)
{
JsonTextWriter writer = new JsonTextWriter(response.Output) {Formatting = Formatting};
JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
serializer.Serialize(writer, Data);
writer.Flush();
}
}
}
public static class JsonNetExtenionMethods
{
public static ActionResult JsonNet(this Controller controller, object data)
{
return new JsonNetResult() {Data = data};
}
public static ActionResult JsonNet(this Controller controller, object data, string contentType)
{
return new JsonNetResult() { Data = data, ContentType = contentType };
}
public static ActionResult JsonNet(this Controller controller, object data, Formatting formatting)
{
return new JsonNetResult() {Data = data, Formatting = formatting};
}
}
答案 1 :(得分:1)
编译器将找不到扩展方法,除非它们位于静态类中。尝试将JsonNet
方法放在他们自己的静态类中,例如, JsonNetExtensions
。还要确保扩展类与控制器位于同一名称空间中,或者控制器顶部有using
语句,扩展类的名称空间。