一尘不染

ASP.NET 5 / MVC 6 Ajax将模型发布到控制器

ajax

在我的ASP.NET 5 MVC 6应用程序中,我想用Ajax发布一些数据到我的控制器。我已经使用ASP.NET MVC
5做到了这一点,并且在空白的ASP.NET MVC
5项目中测试了完全相同的代码,并且可以正常工作,但是对于新版本,我做不到,我也不知道为什么。通过Ajax调用,我可以转到控制器,创建模型,但是字段为null(对于布尔值,则为false)。这是我的代码:

script.js:

var data = {
            model: {
                UserName: 'Test',
                Password: 'Test',
                RememberMe: true
            }
        };

        $.ajax({
            type: "POST",
            url: "/Account/Login/",
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                // Do something interesting here.
            }
        });

AccountController.cs:

[HttpPost]
    public JsonResult Login(LoginViewModel model)
    {
        if (ModelState.IsValid)
        {
            //var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
            //if (result.Succeeded)
            //{
            //     //return RedirectToLocal(returnUrl);
            //}

            ModelState.AddModelError("", "Identifiant ou mot de passe invalide");
            return Json("error-model-wrong");
        }

        // If we got this far, something failed, redisplay form
        return Json("error-mode-not-valid");
    }

LoginViewModel.cs:

public class LoginViewModel
{
    [Required]
    [Display(Name = "UserName")]
    [EmailAddress]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

有任何想法吗 ?谢谢


阅读 199

收藏
2020-07-26

共1个答案

一尘不染

如果您使用的是json,则需要在MVC6上显式使用FromBody

public JsonResult Login([FromBody]LoginViewModel model)

编辑

我认为您正在混合不同的错误。我将尝试描述您应该如何提出请求:

内容类型 必须为 :application / json

您的请求正文 必须为 JSON格式(如JasonLind建议):

{
    UserName: 'Test',
    Password: 'Test',
    RememberMe: true
};

这是检查请求(通过chrome调试器工具F12)或使用请求检查器(如fiddler)时应看到的内容。

如果看到形式为的某物,UserName=Test&Password=Test&RememberMe=true则说明您做错了,那就是形式格式。

您不需要该model变量。如果看到带有“包装器”的请求,则应将其删除。

2020-07-26