AJAX POST 在 .NET Core 2.1 中使用引用的 Razor Class 库给出 404 或 415

AJAX POST giving 404 or 415 in .NETCore 2.1 with referenced Razor Class Library

我有一个 .NETCore 2.1 网络应用程序和一个单独的 Razor Class 库。

RCL 包含一些我打算在单独的项目中使用的常用分部视图和函数。

我正在尝试为控制器制作一个 AJAX post,如下所示:

using Microsoft.AspNetCore.Mvc;

namespace ThinkkaGlobal
{
    [ApiController]
    public class LoginController : Controller
    {
        [HttpPost("thinkka/login")]
        public ActionResult DoLogin([FromBody] ThinkkaUsers.Requests.LoginRequest Req)
        {
            return PartialView("Login", Req);
        }
    }
}

注意属性路由...这不一定是我想要的,但我已经花了 小时 现在试图让它工作,我已经尝试了很多很多不同的路由选项。我的 Startup.cs 文件中也有 app.UseMvcWithDefaultRoute();

最终,我想要的是 AJAX post,它将 return 部分视图...我想使用 jquery-unobtrusive-ajax 来实现,并且这就是我开始的方式,但后来我开始直接使用 jQuery AJAX 这样我就可以把它弄得更乱了。

所以,非常基础 AJAX...

$.ajax({
    url: "thinkka/login",
    type: 'post',
    contentType: "application/json", // (application/x-www-form-urlencoded; charset=UTF-8)
    dataType: 'json',
    success: function (data) {
        console.log(data);
    },
    data: { email: "jamie@jamiehartnoll.co.uk" }
});

快速说明一下,POSTed 对象是一个简单的对象,如下所示:

class LoginRequest 
{
    public string email { get; set; }
    public string password { get; set; }
    public bool remember { get; set; }
    public int location { get; set; }
    public string userpass { get; set; }
}

当我 POST 使用 contentType application/x-www-form-urlencoded; charset=UTF-8 我得到 Error 415 - Unsupported Media Type

当我 POST 使用 contentType application.json 我得到 Error 404 - Not Found

几个小时以来,我一直收到 404,但我认为当时我确实使用了错误的路由。我使用 thinkka/login/DoLogin 作为 URL,即包括被调用的方法名称,但是路由属性覆盖了它,所以在所有的时间里我都在浪费时间让它工作,我想我只是使用错误 URL!

但是......现在......我至少可以得到一个不同的错误代码这一事实是否表明 URL 是正确的?

但我不知道为什么我仍然得到我使用 application/json 的 404,尽管实际上 application/x-www-form-urlencoded; charset=UTF-8 将是正确的 contentType...。不是吗... .

我不知道...已经晚了,我已经做了好几个小时了,这已经毫无意义了!

一如既往,我们将不胜感激!

嗯...我分两个阶段解决了问题...

首先为了正确 return 一个 Partial 这是我最终想要的,我改变了控制器 class 如下

using Microsoft.AspNetCore.Mvc;

namespace ThinkkaGlobal
{
    [ApiController]
    public class LoginController : Controller
     {
         [Route("thinkka/login")]
         [HttpPost] 
         public PartialViewResult DoLogin([FromBody()] ThinkkaUsers.Requests.LoginRequest Req)
          {
             return PartialView("Login", Req);
         }
     }
 }

其次,我将 AJAX 更改为:

$.ajax({
    url: "thinkka/login",
    type: 'post',
    contentType: "application/json",
    dataType: 'json',
    success: function (data) {
        alert('Success ' + data);
    },
    data: JSON.stringify({ email: "Email Address" })
});

没有 Stringify-ing JSON 我更新后的控制器出现 400 错误。

startup.cs 没有任何更改,除了 app.UseMvcWithDefaultRoute(); 之外仍然不包含显式路由声明 - 如前所述,此处需要属性路由。

在我的 AJAX 中使用 application/x-www-form-urlencoded; charset=UTF-8 我得到 415 现在有意义了。

所以还是没看懂

  • 为什么我必须 stringify 我的 JSON Post 数据 - 或者更具体地说,我需要进行哪些更改才能不需要到...

  • 为什么我以前的 Controller 会得到 404,除了它声明的是 ActionResult 类型之外,它在各个方面都是一样的……事实上,对于我的目的来说无论如何都是错误的,但为了学习目的....为什么?