2012-06-12 1 views
1

Учитывая следующий фрагмент на стороне клиента код:Как правильно моделировать привязку json с под-объектами к ASP.NET MVC ViewModel?

var vm = { 
    Input : "Label: Value", 
    Rules : [ 
    { Name : "RemoveString", 
     Params : [ 
     "Label: " 
     ] 
    } 
    ] 
}; 

$.post("/API/ApplyRule", vm, function(data) { }); 

И следующее ViewModel на стороне сервера:

[Serializable] 
public class ApplyRuleRequestViewModel 
{ 
    public string Input { get; set; } 
    public List<RuleViewModel> Rules { get; set; } 
} 

[Serializable] 
public class RuleViewModel 
{ 
    public string Name { get; set; } 
    public List<string> Params { get; set; } 
} 

А следующий код контроллера:

public class APIController : Controller 
{ 
    [HttpPost] 
    public ActionResult ApplyRule(ApplyRuleRequestViewModel model) 
    { 
     //Problem here... model is not fully deserialized into the ViewModel object. 
     return View(); 
    } 
} 

Я имею проблему пытаясь сериализовать часть правил на стороне ViewModel на стороне клиента. При отладке кода на контрольной строке выше упомянутой // Проблема ..., я вижу, что свойства объекта верхнего уровня сделали это, но не под-объектом. Таким образом, я получаю что-то вроде:

var vm = new ApplyRuleRequestViewModel { 
    Input = "Label: Value", 
    Rules = new List<RuleViewModel> { 
    new RuleViewModel { Name = null, Parameters = null } 
    } 
} 

Я ожидал что-то вроде:

var vm = new ApplyRuleRequestViewModel { 
    Input = "Label: Value", 
    Rules = new List<RuleViewModel> { 
    new RuleViewModel { 
     Name = "RemoveString", 
     Parameters = new List<string> { "Label: " } 
    } 
    } 
} 

Что я делаю неправильно здесь? Почему он не привязывает массив правил правильно?

Вам нужно создать собственное собственное связующее устройство, чтобы связать его правильно? Если да, то как?

ответ

1

Вы можете отправить свое сообщение как JSON.

var vm = { 
    Input : "Label: Value", 
    Rules : [ 
    { Name : "RemoveString", 
     Params : [ 
     "Label: " 
     ] 
    } 
    ] 
}; 

$.postJson("/API/ApplyRule", vm, function(data) { }); // See below for definition of `.postJson`. 

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

EDIT Пропущено что-то. Вам необходимо установить contentType, так что .post в его нынешнем виде может не работать.

Это вспомогательный метод для размещения JSON (не только POSTING и , принимающий json, как сообщение сделал бы).

$.postJson = function(url, data, success) { 
    $.ajax({ 
      url: url, 
      type: 'POST', 
      dataType: 'json', 
      data: JSON.stringify(data), 
      contentType: 'application/json; charset=utf-8', 
      success: success 
     }); 
} 
+0

ОК попробует ... –

+0

Спасибо, что сработало :) –