我试图编写一个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",
});
答案 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()}]
};