ASP.NET Базовая база данных MVC не добавляет объект после перенаправления

#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 .