2016-02-16 2 views
1

У меня возникла странная проблема с ASP.NET MVC и отправкой сообщения AJAX. У меня есть привязанный тег на странице с id 'lnkGetExpirDates'. Когда пользователь нажимает на нее, я пытаюсь просто отправить эти жестко запрограммированные данные на свой контроллер, чтобы он мог использовать его в качестве параметров и возвращать результат обратно на страницу.AJAX Post для ASP.NET MVC 6 Метод и параметры действия контроллера - это null

Однако в контроллере параметры всегда имеют значение null/default. Пожалуйста, см. Мой код ниже и дайте мне знать, если я делаю глупую ошибку или что-то в этом роде.

Вот мой AJAX пост:

$("#lnkGetExpirDates").click(function() { 
    e.preventDefault(); 

    var data = { 
     StartDate: "1/19/2016", 
     EndDate: "4/19/2016", 
     ProductType: "New", 
     Count: 1 
    }; 


    $.ajax({ 
     url: '/Products/GetExpirationDates', 
     type: 'POST', 
     data: JSON.stringify(data), 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'html', 
     success: function (data) { 
      $('#ExpirationDates').val(data); 
     } 
    }); 

}); 

Вот метод действия моего контроллера:

// POST: Product/GetExpirationDates 
[HttpPost] 
//[ValidateAntiForgeryToken] 
public IActionResult GetExpirationDates(GetExpirationDatesViewModel vm) 
{ 
    // TODO: Get expiration dates and return them in the response 

    return View(); 
} 

Вот GetExpirationDatesViewModel:

public DateTime StartDate { get; set; } 
public DateTime EndDate { get; set; } 
public string ProductType { get; set; } 
public int Count { get; set; } 

Обратите внимание, что я даже пробовал это без использования модели вообще и просто добавляю параметры к методу действий, такие как startDate, endDate, productType и Count, и все же все происходит как null.

ответ

9

Когда вы укажете значение типа контента как приложение/json, запрос ajax, сделанный сервером, отправит ваш объект js в качестве запроса полезной нагрузки в тело запроса (в json формате). Поэтому в вашем методе действий вы должны использовать атрибут [FromBody].

public IActionResult GetExpirationDates([FromBody] GetExpirationDatesViewModel vm) 
{ 
    return View(); 
} 

Вы должны это сделать, если вы хотите, чтобы отправить сложный JS объект со свойствами, которые опять-таки другая модель/тип

Но данные, которые вы отправляете плоский вид модели. Таким образом, вам не нужно json строчить объект js. Также вы можете удалить свойство типа контента, а также не отправлять строчную версию сложного объекта js.

Это должно работать нормально.

$.ajax({ 
    url: '/Products/GetExpirationDates', 
    type: 'POST', 
    data: data,  
    dataType: 'html', 
    success: function (data) { 
     console(data); 
    } 
}); 

Приведенный выше код будет отправить объект JS в качестве ключевых пар значений (нормальная форма данных) и модель связующий будет иметь возможность сопоставить данные формы вашего представления модели объекта на сервере. Взгляните на this post для более подробного объяснения.

Также я рекомендую использовать вспомогательный метод Url.Action для генерации правильного относительного URL-адреса методу действия.

url: '@Url.Action("GetExpirationDates","Products")', 

Вышеупомянутое должно работать, если ваш код js находится внутри бритвы. Если ваш код находится внутри внешнего js-файла, используйте решение, описанное в this post.

+0

Я очень ценю это. Он отлично работал. Можете ли вы объяснить мне, когда было бы неплохо использовать JSON.stringify? Я принимаю при отправке всей формы как JSON? –

+0

Да. Я немного уточню ответ – Shyju

+0

И еще один маленький вопрос. Допустим, мне нужно в конечном итоге вернуть список дат на веб-страницу. Каким будет мое возвращение в моем методе действий?Кроме того, немного странно, когда я отправляю дату, например, 26 февраля 2016 00:00:00 GMT-0500 (Восточное стандартное время) в качестве параметра, которого она не принимает. Я думаю, я могу только преобразовать его в короткую дату, а затем отправить ... –

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