首页 > 解决方案 > ASP.NET Core - 如何将 Javascript 变量从视图传递到控制器

问题描述

我在 Javascript 函数中有一个变量,我想将其发送到控制器以激活指定的方法。

这是视图中 javascript 函数的代码:

var email = response.email;    //String with an email address

 $.ajax({
     type: "POST",
     url: '@Url.Action("Login", "UsersController")',
     dataType: "html",
     data: { data: email },
                                            
     success: function (data) {
         alert('Your data updated');
         return data;
     },
     error: function (jqXHR, textStatus) {
         alert(textStatus);
     }
                                            
  });

这是我想在控制器中激活的方法:

[HttpPost]
    public IActionResult Login(string email)
    {
        var user = _context.User.FirstOrDefault(u => u.Email == email);

        if (user != null)
        {
            SignIn(user);
            return RedirectToAction("Index", "Home");
        }

        return View("Login", "Users");
    }

每次我运行它时都会收到错误警报,我对 Ajax 还是很陌生,所以我不知道如何处理它。谢谢。

标签: javascriptc#ajaxasp.net-coremodel-view-controller

解决方案


首先,ajax中url中指定的控制器名称需要去掉Controller,即将UsersController改为Users

并且在传递的参数数据中,更改{data:email} to {email:email},或者更改Login动作接收参数名 fromemail to data保证传递的参数名和接收到的参数名一致

而如果要提示更新信息然后跳转到对应的视图,需要在Login动作中返回不同的信息给success方法,然后在success方法中判断数据再跳转

 $.ajax({
     type: "POST",
     url: '@Url.Action("Login", "Users")',
     dataType: "html",
     data: { email: email },
     success: function (data) {
         if (data == "Success") { 
           alert('Your data updated');
           window.location.href = "/Home/Index";
        } else {
           alert("Please enter correct email!");
     }
     },
     error: function (jqXHR, textStatus) {
         alert(textStatus);
     }

  });

行动:

[HttpPost]
    public IActionResult Login(string email)
    {
        var user = _context.User.FirstOrDefault(u => u.Email == email);

        if (user != null)
        {
            SignIn(user);
            return Content("Success");
        }

         return Content("Wrong");
    }

下面是测试结果:(gif中的代码为简化判断。)

在此处输入图像描述


推荐阅读