Как передать данные в jquery в представлении с контроллера

#c# #jquery #asp.net-mvc #model-view-controller

#c# #jquery #asp.net-mvc #модель-представление-контроллер

Вопрос:

У меня есть Viewbag в моем контроллере. И я хочу получить доступ к нему из кода jquery в представлении. Возможно ли это? Я хочу проверить деньги моего клиента, достаточно ли их для покупки продукта. Если у них недостаточно денег, я хочу показать им приятное предупреждение. Возможно ли это, и если да, то как я могу это сделать?

Это мой контроллер [GET];

  public ActionResult inspect(string id, int page = 1)
    {
        if (id == null)
        {
            return RedirectToAction("account", "product");
        }
        ViewBag.href = id;
        ViewBag.user = Session["MAIL"];
        var valuehrefid = db.TBLPRODUCT.Where(x => x.href == id).Select(y => y.ID).FirstOrDefault();
        var accounts = db.TBLACCOUNT.Where(x => x.PRODUCT == valuehrefid amp;amp; x.status == true).ToList().ToPagedList(page, 10);
        return View(accounts);
    }
 

Это мой контроллер [POST];

 public ActionResult buyaccount(int id)
    {
        var mail = (string)Session["MAIL"];
        var userid = db.TBLUSER.Where(x => x.MAIL == mail).Select(y => y.ID).FirstOrDefault();
        var price = db.TBLACCOUNT.Where(x => x.ID == id).Select(y => y.PRICE).FirstOrDefault();
        var user = db.TBLUSER.Find(userid);
        if (user == null || mail == null)
        {
            ViewBag.alert = "usernull";
            return RedirectToAction("login", "home");
        }
        var href = db.TBLACCOUNT.Where(x => x.ID == id).Select(y => y.TBLPRODUCT.href).FirstOrDefault();
        var customercash = user.CASH;
        if (customercash >= price)
        {
            user.CASH -= price;
            var value = db.TBLACCOUNT.Find(id);
            value.status = false;
            var product = db.TBLACCOUNT.Where(x => x.ID == id).Select(y => y.TBLPRODUCT.ID).FirstOrDefault();
            var productd = db.TBLPRODUCT.Find(urun);
            product.STOCK -= 1;
            var date = DateTime.Parse(DateTime.Now.ToShortDateString());
            TBLSALEACTION p = new TBLSALEACTION();
            p.CUSTOMER = userid;
            p.ACCOUNT = id;
            p.PRODUCT = product;
            p.DATE = date;
            p.PRICE = price;
            db.TBLSALEACTION.Add(p);
            db.SaveChanges();
            ViewBag.Uyari = "successful";
        }
        else
        {
            ViewBag.Uyari = "Customer's money is not enough to buy this.";
            int sayfa = 1;
            var valuehrefid = db.TBLPRODUCT.Where(x => x.href == href).Select(y => y.ID).FirstOrDefault();
            var accounts = db.TBLACCOUNT.Where(x => x.PRODUCT == valuehrefid amp;amp; x.status == true).ToList().ToPagedList(sayfa, 10);
            return View("inspect", model: hesaplar);
        }
        return View("~/Views/accounts/inspect/"   href   ".cshtml", href);
    }
 

И это мое мнение

    @if (Session["MAIL"] != null)
        {
    <script>
                $('#TBLACCOUNT').on("click", ".btnBuy", function () {
                    var btn = $(this);
                    Swal.fire({
                        title: 'Warning',
                        text: "Are you sure to buy this?",
                        type: 'warning',
                        showCancelButton: true,
                        confirmButtonColor: '#3085d6',
                        cancelButtonColor: '#d33',
                        confirmButtonText: 'Yes',
                        cancelButtonText: 'No'
                    }).then((result) => {
                        if (result.value) {
                            var id = btn.data("id");
                            $.ajax({
                                type: "POST",
                                url: "/accounts/buyaccount/"   id,
                                success: function (s) {
                                    if (s) {
                                btn.parent().parent().remove();
                                Swal.fire(
                                    'Information ',
                                    'You have successfully purchased!',
                                    'success'
                                );
                                    } else {
                                        Swal.fire({
                                            type: 'error',
                                            title: 'Error.',
                                            text: 'You dont have enough money.',
                                            confirmButtonText: 'Close'
                                        });
                                    }
                                }
                            });
                        }
                    });
                });
    </script>
        }
 

Ответ №1:

добавьте этот класс :

 public class JsonData
{
    public string HtmlUrl{ get; set; }
    public string HtmlBody { get; set; }
    public bool Success { get; set; }
}
 

затем в контроллере возвращается значение Json:

 public ActionResult buyaccount(int id)
    {
        var mail = (string)Session["MAIL"];
        var userid = db.TBLUSER.Where(x => x.MAIL == mail).Select(y => y.ID).FirstOrDefault();
        var price = db.TBLACCOUNT.Where(x => x.ID == id).Select(y => y.PRICE).FirstOrDefault();
        var user = db.TBLUSER.Find(userid);
        if (user == null || mail == null)
        {
             return Json(new JsonData()
            {
                HtmlUrl = "/home/login",
                HtmlBody = "usernull",
                Success = false,
            });
        }
        var href = db.TBLACCOUNT.Where(x => x.ID == id).Select(y => y.TBLPRODUCT.href).FirstOrDefault();
        var customercash = user.CASH;
        if (customercash >= price)
        {
            user.CASH -= price;
            var value = db.TBLACCOUNT.Find(id);
            value.status = false;
            var product = db.TBLACCOUNT.Where(x => x.ID == id).Select(y => y.TBLPRODUCT.ID).FirstOrDefault();
            var productd = db.TBLPRODUCT.Find(urun);
            product.STOCK -= 1;
            var date = DateTime.Parse(DateTime.Now.ToShortDateString());
            TBLSALEACTION p = new TBLSALEACTION();
            p.CUSTOMER = userid;
            p.ACCOUNT = id;
            p.PRODUCT = product;
            p.DATE = date;
            p.PRICE = price;
            db.TBLSALEACTION.Add(p);
            db.SaveChanges();
        }
        else
        {
            
            int sayfa = 1;
            var valuehrefid = db.TBLPRODUCT.Where(x => x.href == href).Select(y => y.ID).FirstOrDefault();
            var accounts = db.TBLACCOUNT.Where(x => x.PRODUCT == valuehrefid amp;amp; x.status == true).ToList().ToPagedList(sayfa, 10);
            return Json(new JsonData()
            {
                HtmlUrl = "/accounts/inspect/hesaplar",
                HtmlBody = "Customer's money is not enough to buy this.",
                Success = false,
            });
        }
        
         return Json(new JsonData()
            {
                HtmlUrl = "/accounts/inspect/href",
                HtmlBody = "successful",
                Success = true,
            });
    }
 

и в скрипте:

 if (s.Success) {
        btn.parent().parent().remove();
        Swal.fire(
              'Information ',
              'You have successfully purchased!',
              'success'
           );
           window.location.href = s.HtmlUrl;
} else {
        Swal.fire({
        type: 'error',
        title: 'Error.',
        text: s.MsgBody,
        confirmButtonText: 'Close'
    });
    window.location.href = s.HtmlUrl;
}
 

Вы не можете перенести программу в другое представление с помощью ajax-запроса, но вам придется вернуться на нужную страницу с помощью javascript в зависимости от ситуации.

Комментарии:

1. Спасибо, но, вероятно, я не смог. : Извините, я новичок. Я обновил свой контроллер, как и ваш отправленный. Но это не приведет к действию «buyaccount». Как я могу перенаправить его на действие buyaccount с идентификатором без ajax? Это мое мнение (как и ваше отправленное); prnt.sc/xipfqq Я тоже обновил свой контроллер, как и ваше сообщение. Также я создал класс.

2. хорошо, я что-то отредактировал, и все работает нормально, но когда у клиента недостаточно денег для покупки продукта, даже если это так, оповещение об ошибке показывает успех. У меня есть viewbag на контроллере. Когда у клиента нет денег: Viewbag. Alert = «Денег клиента недостаточно, чтобы купить это».; Когда у клиентов есть деньги на покупку продукта: Viewbag. Alert = «успешно»; Как я могу передать их в представление в скрипте?

3. Я только что изменил его. Класс jsonData может возвращать три значения, он имеет два строковых значения, и вы можете определить столько переменных, сколько захотите.

4. Спасибо, ты спас мне жизнь 🙂 Хорошего дня