Ajax отправляет массив и bool в метод контроллера - PullRequest
0 голосов
/ 27 декабря 2018

Я пытался отправить массив объектов в метод контроллера, используя AJAX, но даже после попытки различных методов я все еще не получу желаемый результат.Это мой текущий код:

Вид

function SaveGame() {
if ('@Session["Username"]' == '@Model.Player1.Username') {
    p1 = true;
}
else {
    p1 = false;
}
var characters = document.getElementsByClassName("char");
var chardata = [];
for (var i = 0; i < characters.length; i++) {
    var id = characters[i].id;
    var state = characters[i].classList[1];
    chardata.push(id, state);
}
console.log(chardata);
$.ajax({
    url: '@Url.Action("SaveGame", "Game")',
    type: 'GET',
    data: JSON.stringify({ 'character': chardata }),
        cache: false,
        contentType: 'application/JSON',
        success: function (result) {
            alert("Game Saved");
        }
    });

}

Gamecontroller / SaveGame

public bool SaveGame(JsonDecode character)
{
    ViewGame game = (ViewGame)TempData["game"];
    TempData["game"] = game;
    return true;
    //return charLayer.SaveCharacters(game.Id, ids, states, isPlayer1);
}

character будет просто нулевым

JsonDecode

public class JsonDecode
{
    public object[] chardata { get; set; }
}

1 Ответ

0 голосов
/ 27 декабря 2018

Ваш текущий код использует GET в качестве типа для вызова $ .ajax.jQuery ajax отправит GET-запрос к конечной точке с данными, добавленными к строке запроса URL-адреса, к которому он обращается.Когда вы хотите отправить простые значения, это нормально, но когда вы хотите отправить сложный объект, например, что вы хотите отправить, вы должны использовать тип POST.

Кроме того, для привязки модели к работе, структураданных должны быть похожи на структуру вашего представления модели и имена свойств.Исходя из данных, которые вы хотите отправить, похоже, вам нужна модель вида, подобная этой.

public class GameStateVm
{
    public int Id { set;get;}
    public string State { set;get;}
}
public class SaveGameVm
{
    public GameStateVm[] Character { set;get;}
    public bool PFlag { set;get;}
}

, которую вы можете использовать в качестве параметра метода действия HttpPost.

[HttpPost]
public ActionResult SaveGame(SaveGameVm characters)
{   
    //  I am simply returning the posted data as it is, for testing
    //  You may return a boolean value if you want that.      
    return Json(characters);
}

и теперь в своем клиентском коде убедитесь, что у вашего объекта JS есть аналогичные имена Strucutre и свойств.

// JS object with same structure as our SaveGameVm
var d = { PFlag: false, character:[]}; 

d.PFlag = true;  // to do : Set the value based on your condition

// dummy code to add 2 items to the array.
// to do : replace with your code to populate the array
for (var i = 0; i < 2; i++) {
   var id =i;  // to do : replace hard coded values
   var state = 'active';
   d.character.push({ id: id, state: state});
}

$.ajax({
         url: '@Url.Action("SaveGame", "Game")',
         type: 'POST',
         data: JSON.stringify(d),
         contentType: 'application/JSON',
         success: function (result) {
             console.log(result);
         }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...