Sweet Alert 函数在被 js 脚本调用时不会触发

Sweet Alert function doesn't trigger when it's called by a js script

我一直在尝试在用户未登录时进行简单的验证,并在发生这种情况时尝试触发温馨提示消息。如果客户试图将新产品添加到他的购物车但未登录,则此验证有效。

注意:会话变量是 asp.net 核心中已知的实际会话,会话变量只是包含此会话变量的视图模型的一个属性。

我正在使用 asp.net 核心 2.2,使用包含通过 Json 序列化获得的用户 class 的会话变量,起初我尝试调用会话我视图模型的属性,但没有成功,从我读过的内容来看,我必须在视图中注入一个 IHttpContextAccessor,以便获取会话变量并使用它,但是因为我使用序列化 Json 我无法访问视图中的 GetObjectFromJson 方法,所以我放弃并尝试使用 ViewData["Session"] 来传递用户的 id class,如果会话变量为空,amd 将其设置为 0。这个有效,我设法检查了视图中的会话变量,在 js 函数中更具体地说它是 0,但无论如何 Sweet Allert 消息没有触发。


// THIS IS MY ACTION METHOD IN THE CONTROLLER

        [Route("filtrar")]
        [HttpGet]
        public ActionResult Filter(String search)
        {
            HomeFilterViewModel homeFilterViewModel = new HomeFilterViewModel
            {
                tiposDeMaterialDiscografico = _tipoMaterialDiscografico.GetAll(),
                generos = _genero.GetAll(),
                sesion = HttpContext.Session.GetObjectFromJson<Usuario>("Usuario"),

                materialDiscograficos = _materialDiscografico.Search(search).Union(_materialDiscografico.PorArtista(search)).OrderBy(m => m.Nombre)
            };

            if (homeFilterViewModel.sesion != null && homeFilterViewModel.sesion.TipoUsuario.IdTipoUsuario == 2)
            {
                return RedirectToAction("Dashboard", "Admin");
            }

            return View(homeFilterViewModel);
        }

<!-- THIS IS MY VIEW WITH THE JS REFERENCES AND FUNCTIONS AT THE END -->

@model HomeFilterViewModel

@{
    ViewBag.Title = "Material Discográfico";
}

@section Filter {
    <link href="~/css/Filter.css" rel="stylesheet" />
}

<div class="container" style="margin-top: 22px;">
    <div class="row">
        @foreach (var material in Model.materialDiscograficos)
        {
            <div class="col-4" style="min-width: 100px; max-width: 35%">
                <div class="card img-responsive" id="thumb" data-toggle="modal" data-target="#@material.Nombre.Replace(" ", "")">
                    <button class="btn btn-light">
                        @if (material.ImagenPortada == null)
                        {
                            <img class="img-fluid" src="~/images/portadas/default.png" asp-append-version="true" style="padding: 13px;">
                        }
                        else
                        {
                            <img class="img-fluid" src="~/images/portadas/@material.ImagenPortada" asp-append-version="true" style="padding: 13px;">
                        }
                    </button>
                </div>
            </div>

            <div class="modal fade" id="@material.Nombre.Replace(" ", "")" role="dialog">
                <div class="modal-dialog modal-lg">
                    <div class="modal-content">
                        <div class="modal-header text-center">
                            <h4 class="modal-title w-100">@material.Nombre</h4>
                        </div>
                        <div class="modal-body">
                            <h5><strong>Detalles:</strong></h5>
                            <br />
                            <div class="row">
                                <div class="col-lg-5">
                                    <p class="text-center">Autor: @material.Autor.NombreAutor</p>
                                    <p class="text-center">Género: @material.Genero.DescripcionGenero</p>
                                    <p class="text-center">Tipo: @material.TipoMaterialDiscografico.DescripcionTipoMaterialDiscografico</p>
                                    <p class="text-center">Duración Total (segundos): @material.DuracionTotalSegundos</p>
                                    <p class="text-center">Precio: @material.Precio</p>
                                    <p class="text-center">Stock: @material.Stock</p>
                                </div>
                                <br />
                                <div class="col-lg-5 col-centered" style="min-width: 100px; max-width: 35%">
                                    <div class="card img-responsive" id="thumb">
                                        @if (material.ImagenPortada == null)
                                        {
                                            <img class="img-fluid" src="~/images/portadas/default.png" asp-append-version="true" style="padding: 13px;">
                                        }
                                        else
                                        {
                                            <img class="img-fluid" src="~/images/portadas/@material.ImagenPortada" asp-append-version="true" style="padding: 13px;">
                                        }
                                    </div>
                                </div>
                            </div>
                            <h5><strong>Canciones:</strong></h5>
                            <br />
                            <div style="margin: 0 5% 0 5%">
                                @{
                                    if (material.Canciones != null)
                                    {
                                        <div class="row">
                                            <div class="col box"><br /><p class="text-center"><strong>Nombre</strong></p></div>
                                            <div class="col box"><br /><p class="text-center"><strong>Duración (segundos)</strong></p></div>
                                        </div>

                                        @foreach (var cancion in material.Canciones)
                                        {
                                            <div class="row">
                                                <div class="col box">
                                                    <br /><p class="text-center">@cancion.NombreCancion</p>
                                                </div>
                                                <div class="col box">
                                                    <br /><p class="text-center">@cancion.DuracionSegundos</p>
                                                </div>
                                            </div>
                                        }
                                    }
                                }
                            </div>
                            <br />
                        </div>
                        <form asp-controller="Cliente" asp-action="AgregarAlCarrito" method="get">
                            <div class="modal-footer">

                                <div style="float: left;"><button type="button" class="btn btn-outline-danger" data-dismiss="modal">Cerrar</button></div>
                                <div style="float: none;">
                                    <label>Cantidad:</label>
                                    <input type="number" name="cantidad" min="1" max="@material.Stock" />
                                    <input hidden type="text" name="idMaterial" value="@material.IdMaterialDiscografico" />
                                </div>
                                <div style="float: right;"><input type="submit" class="btn btn-outline-success" onclick="validateData();" value="Agregar al carrito" /></div>

                            </div>
                        </form>
                    </div>
                </div>
            </div>


        }

    </div>
</div>

@section SweetAlert2 {
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@8"></script>
    <script src="sweetalert2/dist/sweetalert2.all.min.js"></script>
    <!-- Include a polyfill for ES6 Promises (optional) for IE11 -->
    <script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.js"></script>

    <script type="text/javascript">
    function validateData() {

        let sesion = @ViewData["Sesion"];

            if (sesion == 0) {
                Swal.fire({
                    type: 'error',
                    title: 'Oops...',
                    text: '¡Usted no ha iniciado sesión!',
                    footer: '<a asp-controller="Home" asp-action="Login">Iniciar sesión</a>'
                })

            }
    </script>
}


// THIS IS THE ACTION METHOD THAT THE FORM REDIRECTS TO

[HttpGet]
        public ActionResult AgregarAlCarrito(int idMaterial, int cantidad)
        {

            Usuario usuario = HttpContext.Session.GetObjectFromJson<Usuario>("Usuario");

            if(usuario == null || usuario.IdUsuario == 4 || usuario.IdUsuario == 1)
            {
                return RedirectToAction("Index", "Home");
            }

            CarritoCompras carrito = _carritoCompras.Get(usuario.CarritoCompras.IdCarritoCompras);
            MaterialDiscografico material = _materialDiscografico.Get(idMaterial);

            LineaDeVenta lineaDeVenta = new LineaDeVenta
            {
                Cantidad = cantidad,
                MaterialDiscografico = material,
                CarritoCompras = carrito
            };

            lineaDeVenta.TotalLinea = _lineaDeVenta.CalcularTotalLinea(lineaDeVenta.Cantidad, lineaDeVenta.MaterialDiscografico.Precio);
            lineaDeVenta.CarritoCompras.LineasDeVenta.Add(lineaDeVenta);
            _carritoCompras.Update(carrito);

            return RedirectToAction("ShoppingCart");
        }



// THIS IS MY VIEWMODEL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Entities;

namespace UI.ViewModels
{
    public class HomeFilterViewModel : ViewModelBase
    {
        public IEnumerable<MaterialDiscografico> materialDiscograficos { get; set; }
    }
}

我没有收到任何错误消息,它只是没有触发 Sweet Alert 消息,我阅读了有关如何添加 Sweet Alert 库的文档,但我不确定我是否正确添加了它,或者我的javascript 功能正常。

你可以随时按F12打开DevTools,查看浏览器的console选项卡是否存在error.And,你会发现你在js代码末尾少了一个}

function validateData() {

    let sesion = @ViewData["Session"];

    if (sesion == 0) {
        Swal.fire({
            type: 'error',
            title: 'Oops...',
            text: '¡Usted no ha iniciado sesión!',
            footer: '<a asp-controller="Home" asp-action="Login">Iniciar sesión</a>'
        })

    }
}