• 22-02-2023, 11:33:34
    #1
    Merhaba arkadaşlar. Bir rent a car sistemi yazıyorum fakat bir yerde takıldım. Bilgili arkadaşlar yardım ederse çok sevinirim.

    Sistemde kiralama işlemi yapmak için ilk önce ödeme alınması gerekiyor. Ödemeyi iyzico entegrasyonu ile yaptım ve sorunsuz ödeme alıyorum.Ödeme yapıldıysa kiralama işlemini yapacak şekilde bir sistem yazmak istiyorum. Görseldeki gibi bir form mevcut yani 1 form içerisinde hem araç kiralamaya ait bilgiler mevcut hemde ödeme için gerekli bilgiler mevcut.

    İlk önce ödeme yapacağım için formu ben PaymentController içerisindeki action a post ediyorum ödemeyi alıyorum fakat daha sonra RentalController içerisindeki RentAction ına redirect ettiğim zaman kiralama işlemi gerçekleşmiyor bunu anlayamadım yardımcı olursanız çok sevinirim. Kodlarım aşağıdaki gibidir.


    Payment Controller içerisindeki actionıma ait
     Payment payment = Payment.Create(request, options);
    
                
                if (payment.Status == "success")
                {
                 
                    return RedirectToAction("Rent", "Rental", new {carId=Id});
                }
                else
                {
                    // ödeme başarısız
                    var errorMessage = "Ödeme işlemi başarısız. Lütfen tekrar deneyin.";
                    if (payment.ErrorMessage != null)
                    {
                        errorMessage = payment.ErrorMessage;
                    }
                    TempData["RentError"] = errorMessage;
                }
    
                return RedirectToAction("Detail", "Car", new { CarId = car.Id });
    RentalController içerisindeki Rent action ına ait kodlarım.
     [HttpPost]
            [Authorize(Roles = "User")]
            public async Task<IActionResult> Rent(DateTime RentACar,DateTime EndTime, string TotalPrice, Guid carId)
            {
                var userId = userService.GetUserId();
                var car = await rentalService.GetCarById(carId);
                var rent = new CarRentalDto
                {
                    CarId = carId,
                    RentDate = RentACar,
                    ReturnDate = EndTime,
                    UserId=Guid.Parse(userId),
                    TotalPrice=Convert.ToInt32(TotalPrice),
                    Car=car,
                    
                };
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }
    
                try
                {
                    await rentalService.Rent(rent);
                    return View(rent);
                }
                catch (Exception ex)
                {
                    var errorMessage = ex.Message;
                    TempData["RentError"] = errorMessage;
                    return RedirectToAction("Detail", "Car", new { CarId = rent.CarId });
                }
    
    
            }
  • 22-02-2023, 11:44:14
    #2
    Rent action'ınızın başına [HttpPost] özniteliğini eklemişsiniz, bu yüzden bu eylem yalnızca POST isteklerine yanıt verecektir. Ancak, PaymentController'daki RedirectToAction çağrısı GET isteği yapacaktır.
    Bunun nedeni, RedirectToAction metodunun, belirtilen eyleme GET isteği yapacak bir yönlendirme yanıtı döndürmesidir. Bu nedenle, Rent action'ınızın yalnızca POST isteklerine yanıt verdiğini düşünürsek, PaymentController'daki RedirectToAction çağrısı doğru değil,Bunun yerine, PaymentController'daki eylem tamamlandığında JavaScript kullanarak Rent action'ına POST isteği yapmanız gerekiyor.
    Bunu yapmak için, örnek JS kodu bırakıyorum .net Core a düzenleyebilir ya da direkt javascript kullanabilirsiniz:



    Örnneğin;
    <script>
        var form = document.createElement("form");
        form.setAttribute("method", "post");
        form.setAttribute("action", "/Rental/Rent");
        form.style.display = "none";
    
        var carIdField = document.createElement("input");
        carIdField.setAttribute("type", "hidden");
        carIdField.setAttribute("name", "carId");
        carIdField.setAttribute("value", "@carId");
        form.appendChild(carIdField);
    
        var rentACarField = document.createElement("input");
        rentACarField.setAttribute("type", "hidden");
        rentACarField.setAttribute("name", "RentACar");
        rentACarField.setAttribute("value", "@rentACar");
        form.appendChild(rentACarField);
    
        var endTimeField = document.createElement("input");
        endTimeField.setAttribute("type", "hidden");
        endTimeField.setAttribute("name", "EndTime");
        endTimeField.setAttribute("value", "@endTime");
        form.appendChild(endTimeField);
    
        var totalPriceField = document.createElement("input");
        totalPriceField.setAttribute("type", "hidden");
        totalPriceField.setAttribute("name", "TotalPrice");
        totalPriceField.setAttribute("value", "@totalPrice");
        form.appendChild(totalPriceField);
    
        document.body.appendChild(form);
        form.submit();
    </script>
    Rent action'ına gönderilecek POST isteği JavaScript kullanılarak otomatik olarak oluşturuluyor. Formda, gerekli veriler hidden input elemanları aracılığıyla gönderiliyor. Bu kodu PaymentController'daki eylemde kullanarak Rent action'ına POST isteği yapabilirsiniz.