#javascript #asp.net #knockout.js
#javascript #asp.net #knockout.js
Вопрос:
Я создаю веб-сайт, который в конечном итоге будет похож на планирование покера. В настоящее время я застрял на том, что могу удалять игры после их создания. Проблема, с которой я сейчас сталкиваюсь, заключается в вызове gamesremoveALL с моего контроллера.
Вот код, с которым у меня возникли проблемы (он из моего js-списка игр)
self.removeGames = function () {
$.getJSON("/data/games/remove", function (d) {
self.games.RemoveAll(d);
})
}
};
Вот остальная часть моего кода
Индекс (используется для создания игр)
<html>
<head>
<title>Planning Poker</title>
<style>
.inlinetext {
display: inline;
}
</style>
<script src="Scripts/jquery-2.1.1.js"></script>
<script src="Scripts/knockout-3.1.0.js"></script>
<script type="text/javascript">
$(function () {
$('#button').on('click', function (data) {
$.post('data/games/create/?title=5', function (d) { console.log(d) });
})
});
</script>
</head>
<body>
<h3 class='inlinetext'> Create Game: </h3>
<input type="text" id="testtext" name="ime">
<button id="button" >Create</button>
</body>
</html>
Контроллер
using PlanningPoker.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace PlanningPoker.Controllers
{
public class GMController : ApiController
{
private static List<Game> games = new List<Game>() {
new Game() {
ID = Guid.NewGuid(),
Title = "Damp;D"
}
};
[Route("data/games")]
public IEnumerable<Game> GetAllGames() {
return games;
}
[Route("data/games/create"), HttpPost]
public Guid CreateGame(string title) {
Game g = new Game() {
ID = Guid.NewGuid(),
Title = title
};
games.Add(g);
return g.ID;
}
[Route("data/games/remove"), HttpPost]
public void RemoveGame(Guid id) {
games.RemoveAll(g => g.ID == id);
}
}
}
Список игр (js) Вот где у меня проблема.
function AppViewModel() {
var self = this;
self.games = ko.observableArray([]);
$.getJSON("/data/games", function (d) {
self.games(d);
});
self.removeGames = function () {
$.getJSON("/data/games/remove", function (d) {
self.games.RemoveAll(d);
})
}
};
$(function () {
ko.applyBindings(new AppViewModel());
});
Список игр (html)
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Game List</title>
<script src="Scripts/jquery-2.1.1.js"></script>
<script src="Scripts/knockout-3.1.0.js"></script>
<script src="Gamelist.js"></script>
</head>
<body>
<h4>Games</h4>
<ul data-bind="foreach: $data.games">
<li>
Game <span data-bind="text: $index"> </span>:
<span data-bind="text: Title"> </span>
<a href="#" data-bind="click: $parent.removeGames">Remove</a>
</li>
</ul>
</body>
</html>
Комментарии:
1. Вы сказали, что у вас проблема, в чем ее проблема? (т.е. Ответ об ошибке, подробности).
2. в основном мой вопрос заключается в том, как правильно написать эту часть self.removeGames = function () { $.getJSON(«/data/games/remove», function (d) { self.games. removeAll(d); }) } }; Чтобы он вызывал эту часть из моего контроллера [Route(«data / games /remove»), HttpPost] public void removeGame(идентификатор Guid) { игры. removeAll(g => g.ID == идентификатор); } } }
3. Используйте Post для команд (Delete — это команда) и Get для запросов
Ответ №1:
$.getJSON("/data/games/remove", function (d) {
self.games.RemoveAll(d);
})
В вашем действии контроллера этот маршрут задан как POST-маршрут (HttpPost) к действию CreateGame. Вы не можете отправить getJSON на этот URL. Вам нужно выполнить вызов post ajax.
Кроме того, вы не отправляете значение идентификатора, которое запрашивает действие. может быть, что-то вроде:
$.ajax({
url: '/data/games/remove',
type: 'POST',
data: id,
dataType: 'json'
}).done(function(response) {
//do something with response
});
Это должно позволить ему успешно выполнить действие, передать идентификатор и позволить действию обработать удаление.
Комментарии:
1. тип должен быть установлен в
DELETE
2. ДА. Я просто пытался заставить OP понять, почему. Предпочтительнее использовать HttpDelete и ввести: ‘DELETE’.
Ответ №2:
Предполагая, что self.games является observableArray, имя метода — «removeAll», а не «removeAll»: http://knockoutjs.com/documentation/observableArrays.html