【问题标题】:ASP.NET Web API 2 - Nested Object in Ajax Post coming across as nullASP.NET Web API 2 - Ajax Post 中的嵌套对象显示为空
【发布时间】:2018-01-10 16:09:06
【问题描述】:

我正在尝试编写 MVC/Web API 页面,但在做的不仅仅是基本类型时,我被困在 Web API 帖子部分。我似乎找不到答案,为什么 Roles 对象一直设置为 null 即使它是从客户端发布的(并且它正在传递 ModelState.IsValid 部分?)

如果我取出与角色部分相关的所有代码,它会起作用并且用户会在数据库中创建。

编辑:将 [FromUri] 更改为 [FromBody] 并在角色数据周围添加括号似乎可以做到。其他错误弹出但能够从那里得到它。谢谢。

定义的模型:

public class ExpandedUser
{

        [Key]
        [Display(Name = "User Name")]
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        [Display(Name = "Lockout End Date UTC")]
        public DateTime? LockoutEndDateUtc { get; set; }
        public int AccessFailedCount { get; set; }
        public IEnumerable<UserRoles> Roles { get; set; }
}

API:

    [HttpPost]
    public IHttpActionResult CreateUser([FromUri] ExpandedUser user)

    {

        if (!ModelState.IsValid)
        {
            return BadRequest();
        } else if (user.Roles == null)
        {
            return NotFound();
        }

        var userStore = new UserStore<ApplicationUser>(_context);
        var userManager = new UserManager<ApplicationUser>(userStore);


        /*var roleId = user.Roles.ToList();

       var role = _context.Roles.Select(c => new
       {
           Id = c.Id,
           Name = c.Name,
           Users = c.Users
       }).SingleOrDefault(c => c.Id == roleId.RoleName);*/



        var newUser = new ApplicationUser
        {
            UserName = user.UserName,
            Email =  user.Email,
            PasswordHash = userManager.PasswordHasher.HashPassword(user.Password)

    };


        try
        {
            _context.Users.Add(newUser);
            /*userManager.AddToRole(newUser.Id, role.Name);*/
            _context.SaveChanges();


        }
        catch
        {
            return BadRequest();
        }

        return Ok();
    }

还有 AJAX 调用:

  var payload = {
            Id: 0, UserName: $('#username').val(),
            Email: $('#email').val(),
            Password: $('#password').val(),
            LockoutEndDateUtc: null,
            AccessFailedCount :0,
            Roles: {
            RoleName: $('#role').val()
        }
        };
        payload = JSON.stringify(payload);
        console.log(payload);
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "/api/CreateUser",
            data: payload,
            success: function (data) {
                redir();
            },
            error: function (jqXHR, textStatus, errorThrown) {

            },
            dataType: "json",
        });

【问题讨论】:

  • 既然你这样做了[HttpPost] - 可能你应该定义参数[FromBody],如下所示:public IHttpActionResult CreateUser([FromBody] ExpandedUser user)
  • 如果从IEnumerable&lt;UserRoles&gt; 更改为UserRoles[] 会怎样?我的意思是序列化应该呈现一个具体的对象。 IEnumerable 作为什么序列化到服务器?列表、数组、HashSet……?
  • 好吧,更改为 [FromBody] 解决了 Roles = null 问题。但是现在我在 EntityFramework.dll 中发生了“System.Data.Entity.Validation.DbEntityValidationException”类型的异常,但没有在我需要弄清楚的用户代码中处理。谢谢。

标签: c# asp.net asp.net-mvc entity-framework asp.net-web-api2


【解决方案1】:

你能定义你的有效载荷对象如下(注意角色变成数组属性:

var payload = {
            Id: 0, UserName: $('#username').val(),
            Email: $('#email').val(),
            Password: $('#password').val(),
            LockoutEndDateUtc: null,
            AccessFailedCount :0,
            Roles: [{
            RoleName: $('#role').val()
        }]
        };

【讨论】:

  • 将括号添加到角色中,但它仍然显示为 null 并命中了我为进行故障排除而输入的 NotFound。
【解决方案2】:

将 [FromUri] 更改为 [FromBody] 并在角色数据周围添加括号似乎可以做到这一点。其他错误弹出但能够从那里得到它。谢谢。

【讨论】:

    【解决方案3】:

    首先,您应该删除 FromUri,因为您正在应用发布请求并将 json 数据放入正文中。所以,没有来自uri的数据。此外,您不能通过 Uri 传递复杂的对象。

    [HttpPost]
    public IHttpActionResult CreateUser(ExpandedUser user);
    

    然后修改Javascript对象。 Roles 需要一个集合;

    var payload = {
                Id: 0, UserName: $('#username').val(),
                Email: $('#email').val(),
                Password: $('#password').val(),
                LockoutEndDateUtc: null,
                AccessFailedCount :0,
                Roles: [{ RoleName: $('#role').val()}]
            };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 2019-03-06
      • 2014-03-22
      • 1970-01-01
      • 2014-01-28
      • 2015-11-02
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多