2014-08-29 2 views
1

Я просто добавил JSON.NET в свой проект, и мне бы хотелось создать метод расширения JsonNet, который ведет себя так же, как метод Json, но использует JSON. NET вместо этого.ASP.NET MVC - метод расширения JSON.NET для контроллера

У меня есть класс, который расширяет здесь JsonResult используя Json.NET:

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

Очевидный вопрос: вы добавили правильную инструкцию использования. Что произойдет, если вы напишете Namespace.Class.JsonNet (это, данные, JsonRequestBehavior.AllowGet) – Stilgar

ответ

1

Методы расширения не будут найдены компилятором, если они не находятся в статическом классе. Попробуйте поместить свои методы JsonNet в свой собственный статический класс, например, например. JsonNetExtensions. Также убедитесь, что ваш класс расширений находится либо в том же пространстве имен, что и ваши контроллеры, либо у ваших контроллеров есть оператор using вверху с пространством имен класса расширений.

+0

Методы расширения не будут компилироваться, если они не находятся в статическом классе. Либо эти методы находятся в статическом классе, либо он не говорит нам о том, что они не компилируются :) – Stilgar

+1

@Stilgar По вопросу у него были свои методы расширения в его нестатическом классе 'JsonNetResult'; Я предполагаю, что он просто не пытался построить проект с этой договоренностью. Visual Studio не означает, что это ошибка (т. Е. С красными красноватыми подчеркиваниями), пока вы на самом деле не попытаетесь создать проект. –

+0

Я вижу! Я тоже думал о статическом классе, но решил, что он попытается скомпилировать :) – Stilgar

2

Это тот, который я использую сейчас, он также имеет комментарии для страниц, на которых я вытащил часть источника. Я сделал собственные настройки, включая методы расширения.

И как уже упоминалось, вам необходимо иметь соответствующее пространство имен, добавленное к вашему контроллеру.

Я просто позвоню, используя return this.JsonNet(data). Переопределения, которые я только что разрешил для настройки форматирования, и один, потому что я столкнулся с JS-плагином, который требовал, чтобы тип контента был «plain/text».

//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}; 
    } 
} 
Смежные вопросы