2014-01-13 4 views
0

У меня есть действие контроллера апи, который принимает JObject какпараметр JObject является недействительным в WebAPI действий

public class ThemeController : ApiController 
{ 
    [HttpGet] 
    public String Get(String siteName, JObject lessVariables) 
    { 

и Ajax вызова

$.ajax({ 
    url: '/api/Theme/Get', 
    data: { lessVariables: JSON.stringify({'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}), siteName: "UnivOfUtah" } 
    }); 

Когда я смотрю на HttpContext.Current.Request. Params ["lessVariables"] дает правильную строку json, но lessVariables - пустой JObject. Есть ли что-то еще, что мне нужно сделать, чтобы настроить Json.Net на это?

Я также попытался это на регулярное действие контроллера

У меня есть действия контроллера, который принимает JObject как

public class ThemeController : Controller 
{ 
    [HttpPost] 
    public String Post(String siteName, JObject lessVariables) 
    { 

и Ajax вызов

$.ajax({ 
    url: '/Theme/Post', 
    data: { lessVariables: JSON.stringify({'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}), siteName: "UnivOfUtah" } 
    }); 

же результат

ответ

2

Проблема в том, что lessVariables теперь является Строкой. Вся структура, вероятно, выглядит следующим образом:

{ 
    "lessVariables": "{'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}", 
    "siteName": "UnivOfUtah" 
} 

Вот почему вы можете увидеть правильную строку в Params, но эта структура не в состоянии преобразовать его в JObject, не зная, что это Json. Когда вы Stringify корневой объект запроса, WebApi достаточно умен, чтобы воспринимать его как Json в целом, но вы стробили значение внутри, поэтому не подозреваете, что его следует обрабатывать как json.

Чтобы исправить это, вы можете сделать заказ связывания с моделью связующего или настраиваемого действия, или просто изменить свой метод:

[HttpGet] 
public String Get(String siteName, String lessVariables) 
{ 
    JObject jo = JObject.Parse(lessVariables); 

Update:

Для того, чтобы вопрос яснее, это обрабатывается отлично от WebAPI, но lessVariables еще строка:

[HttpGet] 
public String Get(JObject rootObject) 
{ 
    // you now have rootObject which has a "siteName" and "lessVariables" parameter 
    var siteName = rootObject.GetValue("siteName"); 
    var lessVariables = rootObject.GetValue("lessVariables"); 
    // lessVariables.Type would return the JTokenType String 
+0

Это сообщение, кажется, думает иначе http://stackoverflow.com/questions/12730280/posting-a-jobject-to-an-action – DrSammyD

+0

Как я уже сказал, в ссылке, которую вы опубликовали, это корневой объект, который был сжат, что отлично работает. Однако в вопросе выше это значение внутри корневого объекта; по умолчанию структура WebApi не будет анализировать это автоматически, она просто попытается назначить строку lessVariables для JObject, который не будет работать без разбора. – Karhgath

+0

О, я вижу. Спасибо, я буду работать с этим, я думаю. – DrSammyD

 Смежные вопросы

  • Нет связанных вопросов^_^