【发布时间】: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<UserRoles>更改为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