ASP.NET Web API 2 - Ajax中的嵌套对象发布为null

时间:2018-01-10 16:09:07

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

我试图编写一个MVC / Web API页面,并且在执行的不仅仅是基本类型时,我仍然停留在Web API帖子部分。我似乎无法找到答案为什么Roles对象保持设置为null,即使它从客户端发布(并且它通过了ModelState.IsValid部分?)

如果我拿出与Roles部分相关的所有代码,它就可以工作,并且用户将在数据库中创建。

编辑:将[FromUri]更改为[FromBody],并在Roles数据周围添加Bracket似乎就可以了。其他错误突然出现,但能够从那里拿走它。谢谢。

定义的模型:

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",
        });

3 个答案:

答案 0 :(得分:0)

您可以将您的有效负载对象定义如下(注意角色成为数组属性:

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

答案 1 :(得分:0)

将[FromUri]更改为[FromBody]以及在Roles数据周围添加Bracket似乎可以做到这一点。其他错误突然出现,但能够从那里拿走它。感谢。

答案 2 :(得分:0)

Firslty,您应该删除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()}]
        };