Данные параметра MVC3 jquery ajax равны нулю на контроллере

У меня есть действие контроллера, которое я хочу обновить с помощью вызова jquery. Действие выполняется, но в параметрах нет данных.

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

kendoui grid in view
...
columns.Command(command =>
{
    command.Custom("ToggleRole").Click("toggleRole");
});
...

Модель имеет тип List‹_AdministrationUsers>.

public class _AdministrationUsers
{
    [Key]
    [ScaffoldColumn(false)]
    public Guid UserID { get; set; }

    public string UserName { get; set; }

    public string Role { get; set; }
}

Вот мой сценарий toggleRole:

<script type="text/javascript">
     function toggleRole(e) {
         e.preventDefault();
         var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
         alert(JSON.stringify(dataItem));

         $.ajax({
             type: "POST",
             url: '@Url.Action("ToggleRole", "Administration")',
             data: JSON.stringify(dataItem),
             success: function () {
                 RefreshGrid();
             },
             error: function () {
                 RefreshGrid()
             }
         });
     }
</script>

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

[HttpPost]
public ActionResult ToggleRole(string UserID, string UserName, string Role)
{
    ...
}

Действие контроллера срабатывает, но ни в одном из параметров нет данных.

Я поместил предупреждение в javascript, чтобы убедиться, что в переменной «dataItem» действительно есть данные. Вот как выглядит текст предупреждения:

{"UserID":"f9f1d175...(etc.)","UserName":"User1","Role","Admin"}

person user1304444    schedule 25.07.2012    source источник


Ответы (3)


Вы пытались указать dataType и contentType в сообщении ajax?

$.ajax({
             type: "POST",
             url: '@Url.Action("ToggleRole", "Administration")',
             data: JSON.stringify(dataItem),
             dataType: "json",
             contentType: "application/json; charset=utf-8",
             success: function () {
                 RefreshGrid();
             },
             error: function () {
                 RefreshGrid()
             }
         });
person G-Man    schedule 25.07.2012
comment
Это сделало это. Огромное спасибо! - person user1304444; 25.07.2012
comment
Здесь интересно: dataType — ожидаемый тип возвращаемого значения, где contentType — данные, отправляемые на сервер. api.jquery.com/jQuery.ajax - person George; 14.04.2014

Похоже, вы отправляете весь объект в виде одной строки Json, а контроллер ожидает три строки. Если вы используете MVC3, имена параметров также должны соответствовать подписи контроллера. Попробуйте проанализировать ваш объект данных, чтобы он соответствовал входным данным, ожидаемым от контроллера. Что-то вроде этого:

$.ajax({
             type: "POST",
             url: '@Url.Action("ToggleRole", "Administration")',
             data: { UserID: dataItem.UserID, UserName: dataItem.UserID, Role: dataItem.Role },
             dataType: "json",
             contentType: "application/json; charset=utf-8",
             success: function () {
                 RefreshGrid();
             },
             error: function () {
                 RefreshGrid()
             }
         });

Надеюсь, это поможет!

person Logard    schedule 26.07.2012
comment
Спасибо за ответ. GX заметил, что я не указал dataType или contentType. Как только я это сделал, все заработало, как и ожидалось. Мне не нужно было анализировать данные. Я даже смог избавиться от (string, string, string) и просто использовать свою модель представления для параметров контроллера. - person user1304444; 27.07.2012

{"UserID":"f9f1d175...(etc.)","UserName":"User1","Role","Admin"}

Мне кажется неправильным. Разве ты не хотел бы этого?

{"UserID":"f9f1d175...(etc.)","UserName":"User1","Role" : "Admin"}

Обратите внимание на «Роль»: «Администратор».

person The Internet    schedule 25.07.2012
comment
Извините, я просто неправильно написал. Я не смог скопировать/вставить предупреждающее сообщение. Хороший улов, однако. - person user1304444; 25.07.2012