2012-07-03 4 views
0

Извините за фиктивный вопрос, но я не могу найти простой и чистый способ сделать что-то простое. У меня есть MVC-контроллер, который должен возвращать объект JSON, который будет использоваться некоторым JavaScript; если я установил его возвращаемый тип в JsonResult и вернул Json (objecttoserialize), я могу видеть через Firebug, что код JSON возвращается и интерпретируется правильно. Во всяком случае, я должен использовать вручную закодированную строку JSON, потому что:JsonResult из уже форсированной строки

  • компонент, который упорядочивает объект Я хочу вернуться хозяйничается во внешней библиотеке, и я не должен трогать.
  • этот компонент сериализуется сам по себе, поскольку он имеет член словаря , представляющий свойство NAME и VALUE соответствующего объекта JS.

Например, запись в словаре, такая как «ширина» для ключа и «20» для значения, должна быть сериализована как {width: "20"}, то есть, как если бы объект .NET обладал свойством Ширина со значением 20, тогда как у него просто есть словарь с переменным числом таких пар свойств/значений, который должен быть представлен свойствами объекта в объектах JS. Вот почему компонент имеет свой собственный метод сериализации JSON. Таким образом, я должен просто вернуть созданный им JSON.

Поскольку метод Json сериализует объект ввода .NET, я искал googled вокруг, я считаю, что могу использовать ContentResult. Таким образом, я попытался вернуть ContentResult с Content = сериализованной строкой и ContentType = "application/json"; так или иначе клиент JS, похоже, не может понять, что это объект JSON и не удается. Если вместо этого я возвращаю JsonResult, он работает так, как ожидалось, но, конечно, свойства, представленные его членом Словаря, теряются. Я ожидал, что JsonResult будет эквивалентен ContentResult выше, но это, похоже, не так. Код JS, как:

request: function (nodeId, level, onComplete) { 
$.ajax({ 
    url: "/Node/Get", type: "POST", dataType: "json", 
    data: { id: nodeId, level: level, depth: 3 }, 
    success: function (data) { 
     var ans = data; 
     onComplete.onComplete(nodeId, ans); 
    } 
}); 

Если я устанавливаю точку останова в сценарии в Firebug, когда я вернусь JsonResult функция успех ударил; когда я возвращаю ContentResult, он никогда не попадает, и страница остается загруженной загруженным объектом. (Этот JS относится к SpaceTree www.thejit.org). Может ли кто-нибудь дать подсказку?

ответ

0

Мне удалось заставить его работать с каким-то трюком, но я хотел бы знать, есть ли лучшее решение для этого, и во всяком случае, если это правда, что мне действительно нужно использовать JsonResult (или производный класс, как в этом трюке), чтобы заставить JS работать должным образом. Я получил класс от JsonResult и изменил метод ExecuteResult, чтобы он просто прошел через полученную строку JSON:

public sealed class PassthroughJsonResult : JsonResult 
{ 
    public string Json { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
    if (context == null) 
     throw new ArgumentNullException("context"); 

    HttpResponseBase response = context.HttpContext.Response; 

    if (!String.IsNullOrEmpty(ContentType)) 
     response.ContentType = ContentType; 
    else 
     response.ContentType = "application/json"; 

    if (ContentEncoding != null) 
     response.ContentEncoding = ContentEncoding; 

    if (Json != null) response.Write(Json); 
    } 
} 
Смежные вопросы