【问题标题】:MVC 5 AJAX Code is not accessing Controller Class Action Server SideMVC 5 AJAX 代码未访问控制器类操作服务器端
【发布时间】:2019-07-06 08:16:06
【问题描述】:

代码的意图: 这段代码的目的是接受通过作用域传递给它的数据,并放在一个数组中,以通过 AJAX 传递给登录控制器(服务器端)。

问题 AJAX 代码似乎没有成功联系服务器端操作。

  1. 我已尝试将操作从登录控制器移动到主控制器:没有成功。
  2. 我已尝试遵循之前遇到此问题的人的指南:没有成功。
  3. 我已尝试将 URL 硬编码到操作:没有成功。

下面是 AJAX 调用:

    login: function (username, password) {
                var cred = { "uname": username, "pass": password };
                var response = $http({
                    method: "POST",
                    url: '@(Url.Action("CheckUser","Login"))',
                    data: JSON.stringify({ model: cred }),
                    contentType: 'application/json; charset=utf-8',
                    dataType: "JSON",
                    success: function (msg) {
                        if (msg) {
                            console.log("success: " + msg);
                        }
                    },
                    error: function (msg) {
                        if (msg) {
                            console.log("Error:" + msg);
                        }
                    },
                    failure: function (msg) {
                        if (msg) {
                            console.log("fail: " + msg);
                        }
                    }
                });

接下来是动作代码:

     namespace test4.Controllers
{
    public class LoginController : Controller
    {
        // GET: Login
        public ActionResult Login()
        {
            return View();
        }

        public class UserCred
        {
            public string Uname { get; set; }
            public string Pass { get; set; }  
        }
        [HttpPost]
        public ActionResult CheckUser(UserCred umodel) 
        {
            Console.WriteLine("I am here");
            if (!ModelState.IsValid)
            {
                return Content("0");
            }

            string uname = umodel.Uname;
            string pword = umodel.Pass;

            using (localtestEntities entity = new localtestEntities()) {
                var user = entity.users.Where(u => u.uname == uname).FirstOrDefault();
                if (user != null) {
                    if (pword == user.pw) {
                        Session["LoginID"] = user.id;
                        Session["Username"] = user.fname + ' ' + user.lname;
                        return Content(user.id.ToString());
                    } else {
                        return Content("0");
                    }
                } else {
                    return Content("0");
                }
            }
            /* Begin Assigning values */
        } //End Check User
    }
}

预期的结果是向客户端代码传回传递的字符串比较是否与数据库中的内容匹配。

【问题讨论】:

  • 那个JS在哪里执行?你检查过浏览器的开发控制台吗?它说什么错误?正在生成什么 URL?这些都是您必须检查并包含在帖子中的基本内容
  • @CamiloTerevinto 这个 JS 代码是从我的 /Scripts/drivers 文件夹中执行的,而控制器文件位于 /Controllers/LoginControllers 中。在 VS 2017 中使用调试器时,代码在“var response....”处死掉了
  • 所以@keyle56 的回答实际上是正确的。这是一个很长的镜头,因为它可能是一个完全不同的问题

标签: c# asp.net-mvc-5 asp.net-ajax


【解决方案1】:

几件事:

  1. $Http({... 不是实际的 ajax 函数。我建议将$.post() 用于[HttpPost],将$.get() 用于[HttpGet]。您可以从此处的 jQuery 文档中详细查看:https://api.jquery.com/jquery.post/

  2. 该 URL 将不起作用。您不能在 JS 中访问 razor 辅助方法。实际上,您实际上是在将@(Url.Action("CheckUser","Login")) 传递到您的网址中,因此它看起来类似于localhost:3000/@(Url.Action("CheckUser","Login")),这显然不是一条合法的路线。您将不得不以不同的方式将该 URL 获取到您的 ajax 函数。一些选项:

1) 在 .cshtml 文件的标题中,执行以下操作:

    <script>
        $(() => {
            const url = `@Url.Action("CheckUser","Login")`;

            //Pass that into your JS code via a constructor parameter if your JS 
            //is a class or by function parameter if your JS code is a function.
            const myJSClassNameHere = new myJSClassHere(url);
        });
    </script>

2) 您可以将 url 硬编码到 ajax 调用中。如果您预计网址不会更改和/或您的标准允许,这是一个可行的选择。

【讨论】:

  • 您假设代码被放置在一个 JS 文件中,但 OP 并没有这么说。
  • @keyle56 我之前尝试对 URL 进行硬编码,但没有成功。
  • @Paradigm 你能告诉我你硬编码的网址是什么吗?
  • @CamiloTerevinto 你是正确的,我确实认为,但据我所知,我不知道你还能在哪里使用 ajax?
  • 在 .cshtml 文件中,您可以使用 &lt;script&gt; 标签并像在任何 HTML 文件中一样添加 JavaScript
猜你喜欢
  • 2014-08-03
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多