#c# #asp.net #asp.net-core #asp.net-mvc-4 #asp.net-web-api
#c# #asp.net #asp.net-core #asp.net-mvc-4 #asp.net-web-api
Вопрос:
У меня здесь 2 ситуации.Первый происходит, когда страница, к которой я направляюсь, существует, а другой происходит, когда страница не существует.Немного странно.
Я пытаюсь добавить объект в свою базу данных в asp.net ядро, но когда я нажимаю кнопку заказа на своей странице, она перенаправляет меня на страницу индекса приложения (ничего сложного, что можно решить), но моя проблема в том, что объект, который я отправляю в запросе POST, не добавляется в базу данных.
С другой стороны, если страница не существует, объект добавляется в базу данных (без проблем), но я получаю внутреннюю ошибку сервера, в которой говорится, что «Индекс» не найден в папках, которые использовались при поиске страницы.Мой вопрос в том, как я могу по-прежнему добавлять объект в свою базу данных и по-прежнему перенаправлять на страницу, на которую я хочу перенаправить (например, на страницу «Спасибо за вашу покупку»).
Теперь я предоставлю код для контроллера, который я использовал, и код конечных точек:
Конечные точки:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Контроллер:
[Route("api/shopping")]
[ApiController]
public class SendItemsController : Controller
{
private AppDbContext _db;
public SendItemsController(AppDbContext db)
{
_db = db;
}
[HttpPost]
[Consumes("application/json")]
public async Task<IActionResult> Save([FromBody] ShoppingCart s)
{
await _db.ShoppingCarts.AddAsync(s);
await _db.SaveChangesAsync();
return RedirectToPage("Index");
}
public IActionResult Index()
{
return View();
}
}
<form method="post" asp-controller="SendItems" asp-action="Save">
<div class="form-group row">
<div class="col-4">
<label id="clientName"></label>
</div>
<div class="col-6">
<input id="inputName" type="text" />
</div>
</div>
<div class="form-group row">
<div class="col-4">
<label id="clientAddress"></label>
</div>
<div class="col-6">
<input id="inputAddress" type="text" />
</div>
</div>
<div class="form-group row">
<div class="col-4">
<label id="clientMail"></label>
</div>
<div class="col-6">
<input id="inputMail" type="text" />
</div>
</div>
<div class="form-group row">
<div class="col-3 offset-4">
<button class="btn btn-primary " id="orderB">ORDER</button>
</div>
</div>
</form>
Вот javascript, который я использую на странице корзины:
var orderB = document.getElementById("orderB");
orderB.addEventListener("click", function () {
var inputName = document.getElementById("inputName").value;
var inputAddress = document.getElementById("inputAddress").value;
var inputMail = document.getElementById("inputMail").value;
var auxArray = [];
for (var i = 0; i < productsAux.length; i ) {
if (productsAux[i]!="") {
auxArray[i-1] = { "productName": productsAux[i].titlu, "productPrice": productsAux[i].pret, "quantity": localStorage.getItem(productsAux[i].titlu) };
}
}
var shoppingCart = {
productList: auxArray,
clientName: inputName,
clientAddress: inputAddress,
clientMail: inputMail
};
$.ajax({
type: "POST",
data: JSON.stringify(shoppingCart),
url: "api/Shopping",
contentType: "application/json;charset=utf-8",
})
})
Комментарии:
1. Если он попадает в перенаправление в этом коде, объект будет сохранен. Похоже, вам нужно подключить отладчик и проверить, работает ли этот метод вообще.
2. @mason это происходит не с первого раза, но если я перейду на страницу своей корзины и снова нажму на кнопку, она попадет.
Ответ №1:
RedirectToPage
используется на странице Razor, хотя это проект MVC, я думаю, вам нужно использовать RedirectToAction
.
когда я нажимаю кнопку заказа на своей странице, она перенаправляет меня на страницу индекса приложения
Итак, вы хотите запустить Save
действие в SendItemsController
, нажав кнопку заказать? Как выглядит запрос, правильный ли URL? Может быть, вы можете показать нам код на стороне клиента.
Я сделал простую демонстрацию и протестировал с postman, у вас может быть ссылка.
[HttpPost]
[Consumes("application/json")]
public async Task<IActionResult> Save([FromBody] ShoppingCart s)
{
await _db.ShoppingCarts.AddAsync(s);
await _db.SaveChangesAsync();
return RedirectToAction("Thanks");
}
[HttpGet("Thanks")]
public IActionResult Thanks()
{
return View();
}
Обновить:
@section scripts{
<script>
var orderB = document.getElementById("orderB");
orderB.addEventListener("click", function (e) {
e.preventDefault();
var inputName = document.getElementById("inputName").value;
var inputAddress = document.getElementById("inputAddress").value;
var inputMail = document.getElementById("inputMail").value;
var auxArray = [];
for (var i = 0; i < productsAux.length; i ) {
if (productsAux[i] != "") {
auxArray[i - 1] = { "productName": productsAux[i].titlu, "productPrice": productsAux[i].pret, "quantity": localStorage.getItem(productsAux[i].titlu) };
}
}
var shoppingCart = {
productList: auxArray,
clientName: inputName,
clientAddress: inputAddress,
clientMail: inputMail
};
$.ajax({
type: "POST",
url: "/api/Shopping",
contentType: "application/json;charset=utf-8",
data: JSON.stringify(shoppingCart),
})
})
</script>
}
Комментарии:
1. Я пытался сделать то, что вы сказали, но теперь я получаю 415 «Эта страница не работает»
2. Я добавил html для формы, которую я использую. С другой стороны, если у меня есть метод,
public IActionResult Index() { return View(); }
он добавляет объект в базу данных, но не может найти страницу индекса. Без этого метода я получаю 415, о котором я говорил.3. Должен ли я создавать другой MapControllerRoute, потому что, похоже, все перенаправляется в метод Index.
4. Где находится страница благодарности, размещенная в вашем примере?
5. Смотрите мое обновление, страница благодарности просто возвращается действием Thanks. Если вы не знаете, как добавить представление, щелкните правой кнопкой мыши на действии «Спасибо», выберите
Add View
.