ASP.NET MVC-控制器的JSON.NET扩展方法



我刚刚将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。

如果有帮助的话,这两个类位于不同的名称空间中。

这是我现在使用的一个,它还为我从中提取一些源代码的页面提供了注释。不过,我也做了一些调整,包括扩展方法。

如前所述,您需要在控制器中添加适当的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};
    }
}

编译器不会找到扩展方法,除非它们在静态类中。尝试将JsonNet方法放在它们自己的静态类中,例如JsonNetExtensions。还要确保扩展类与控制器位于同一命名空间中,或者控制器顶部有一个带有扩展类命名空间的using语句。

相关内容

  • 没有找到相关文章

最新更新