Как передать объект javascript контроллеру C# MVC 4

в MVC4, как вы передаете объект javascript контроллеру C# в AJAX? Наконец, я попробовал это, но это не сработало.

клиентская сторона Javascript:

    var myData = {Propr1: '', Propr2: ''};
    $.ajax({
        type: 'POST',
        data: JSON.stringify(myData),
        url: '/Home/SubmitMyData',
        contentType: 'application/json',
        dataType: 'json',
        success: alert('Youhou'),
        error: alert('not good')
    });

C# серверный метод:

    public ActionResult SubmitMyData(MyParamModel myParam)
    {
        // Do my stuff here with my parameter
        return View();
    }

    public class MyParamModel
    {
        string Prop1 { get; set; }
        string Prop2 { get; set; }
    }

мой параметр всегда равен null. Я попытался изменить contentType, но он все еще не работает. Где мои ошибки? Я нашел несколько сообщений, но я не нашел, что я сделал неправильно.

Спасибо большое.

2 ответов


  1. убедитесь, что имена свойств совпадают между javascript и моделью C#. В вашем вопросе у вас было Propr1 и Propr2 для объекта javascript, но в модели C# у вас было Prop1 и Prop2 (отсутствует "r").
  2. не stringify данные перед отправкой, и не устанавливайте dataType to json. MVC может отлично разбирать коллекцию параметров post без сериализации json в вашем коде.
  3. пропустить contentType, это не необходимый. WebAPI должен автоматически определить это. Вы можете оставить его, но он посторонний.
  4. убедитесь, что свойства модели общественного.

клиентская сторона Javascript:

    var myData = {Prop1: '', Prop2: ''}; // #1
    $.ajax({
        type: 'POST',
        data: myData, // #2
        url: '/Home/SubmitMyData',
        //contentType: 'application/json', #3
        //dataType: 'json', #2
        success: alert('Youhou'),
        error: alert('not good')
    });

C# серверный метод:

    public ActionResult SubmitMyData(MyParamModel myParam)
    {
        // Do my stuff here with my parameter
        return View();
    }

    public class MyParamModel // #4
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }

значение, которое вы передаете для data свойство должно быть объектом, а не строкой:

data: myData,

имена свойств должны соответствовать:

var myData = { Prop1: '', Prop2: ''};

вам нужно использовать [FromBody] атрибут вашего значения параметра:

public ActionResult SubmitMyData([FromBody] MyParamModel myParam)

и свойства модели должны быть public:

public class MyParamModel
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}