c# - ASP.NET 5/MVC 6 Ajax 将模型发布到 Controller

标签 c# ajax asp.net-core asp.net-core-mvc

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

脚本.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.
            }
        });

账户 Controller .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");
    }

登录 View 模型.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; }
}

有什么想法吗? 谢谢

最佳答案

如果你使用 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 变量。如果您看到带有“包装器”的请求,则应将其删除。

关于c# - ASP.NET 5/MVC 6 Ajax 将模型发布到 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28782928/

相关文章:

c# - 如何使用状态访问器获取 Bot Framework 中的属性

javascript - .net core 2.1 在来自 axios 和 Vue.js 的 ajax 请求中绑定(bind)数组

c# - 如何在.net core 3.1 Winforms中使用ConfigurationBuilder?

C#:属性/字段命名空间歧义

c# - 没有选定项目的列表选择器

jQuery 脚本文件加载两次

php - 如何保存ajax数据而不因点击后退按钮而丢失?

c# - 从数据库中读取数据并将数据存储在列表中

jquery - jquery 中的自动完成+隐藏字段?

c# - 支持编译依赖的多个版本 (vNext)