2011-01-11 4 views
15

Я видел несколько вопросов, связанных с подобной проблемой, я прочитал их, последовал за ними, но все же у меня такая же проблема.Пропустить объект из JSON в контроллер MVC - его всегда null?

Я в основном создаю объект в javascript и пытаюсь вызвать метод на контроллере, который вернет строку html. Не JSON.

Я играл с dataType и contentType, но до сих пор не радуюсь. Извините, если фрагменты кода немного беспорядочны.

Постройте объект в JS.

function GetCardModel() { 
    var card = {}; 
    card.CardTitle = $("#CardTitle").val(); 
    card.TopicTitle = $("#TopicTitle").val(); 
    card.TopicBody = $("#TopicBody").data("tEditor").value(); 
    card.CardClose = $("#CardClose").val(); 
    card.CardFromName = $("#CardFromName").val(); 
    return card; 
} 

Взгляните на объект - все выглядит хорошо и как следует в JSON.

var model = GetCardModel(); 
alert(JSON.stringify(GetCardModel())); 

сделать вызов ...

$.ajax({ 
      type: "POST", 
      url: "/Postcard/Create/Preview/", 
      dataType: "json", 
      //contentType: "application/json", 
      data: GetCardModel(), 
      processData: true, 
      success: function (data) { 
       alert("im back"); 
       alert(data); 
      }, 
      error: function (xhr, ajaxOptions, error) { 
       alert(xhr.status); 
       alert("Error: " + xhr.responseText); 
       //alert(error); 
      } 
     }); 

Всегда, когда я ступаю в контроллер, объект всегда есть, но с нулевыми значениями для всех свойств.

+0

Хорошо, не редактируйте ошибку из своего вопрос. Делает это более жестким, чтобы увидеть, что нашел Дарин! ('data' выше было' date' в [первой версии] (http://stackoverflow.com/revisions/4656232/1), natch) – ruffin

+1

Это была не проблема, это была опечатка в вопросе. Всегда читайте комментарии к ответам – SteveCl

ответ

26

Имя параметра должно быть data, не date:

$.ajax({ 
    type: 'POST', 
    url: '/Postcard/Create/Preview/', 
    dataType: 'json', 
    data: { 
     CardTitle: $("#CardTitle").val(), 
     TopicTitle: $("#TopicTitle").val(), 
     TopicBody: $("#TopicBody").data("tEditor").value(), 
     CardClose: $("#CardClose").val(), 
     CardFromName: $("#CardFromName").val() 
    }, 
    success: function (data) { 
     alert('im back'); 
     alert(data); 
    }, 
    error: function (xhr, ajaxOptions, error) { 
     alert(xhr.status); 
     alert('Error: ' + xhr.responseText); 
    } 
}); 

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

[HttpPost] 
public ActionResult Preview(Card card) { ... } 

с ниже модели:

public class Card 
{ 
    public string CardTitle { get; set; } 
    public string TopicTitle { get; set; } 
    public string TopicBody { get; set; } 
    public string CardClose { get; set; } 
    public string CardFromName { get; set; } 
} 
+0

Да, это была опечатка ... извините. – SteveCl

+0

@SteveCI, ОК, пожалуйста, просмотрите мое обновление, но даже с внешней функцией он отлично работает для меня. –

+0

моя модель такова, но с несколькими дополнительными реквизитами. ОК, теперь он переходит к модели контроллеру, но мне нужно было настроить его так, как вы сказали, кроме как изменить тип данных на текст и добавить в contentType к application/json - это тот, который останавливал передаваемые данные. remove processData - не уверен, что это делает или по умолчанию. – SteveCl

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