我正在按照一本告诉你如何编辑用户角色的书来做。一切都很顺利,直到我看到一行代码。我认为这将是一个非常简单的解决方案,然而,我无法理解它。
var result = await _userManager.AddToRoleAsync(user.Id,
selectedRole.Except(userRoles).ToArray<string>());
上面那行代码返回了一个错误。
"Argument 2: cannot convert from 'string[]' to 'string'"
在书中,它显示。
.ToArray<string>
但是,在我的代码中,它只是告诉我重构到。
.ToArray());
有没有其他方法可以转换成字符串?我把代码贴在下面,谢谢。
编辑用户代码
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EditUser(EditUserViewModel model, params string[] selectedRole)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByIdAsync(model.Id);
if (user == null)
{
return HttpNotFound();
}
user.UserName = model.UserName;
user.FirstName = model.FirstName;
user.LastName = model.LastName;
var userRoles = await _userManager.GetRolesAsync(user.Id);
selectedRole = selectedRole ?? new string[] { };
var result = await _userManager.AddToRoleAsync(user.Id,
selectedRole.Except(userRoles).ToArray<string>()); // may not be right
if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
result = await _userManager.RemoveFromRoleAsync(user.Id, userRoles.Except(selectedRole).ToArray().ToString()); // put to string
if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
return RedirectToAction("Index");
}
ModelState.AddModelError("", "Something's failed.");
return View();
}
编辑用户视图模型
public class EditUserViewModel
{
public string Id { get; set; }
[Required]
[Display(Name = "Username")]
public string UserName { get; set; }
[Required(AllowEmptyStrings = false)]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
[Required]
[Display(Name = "First Name")]
[StringLength(50)]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last Name")]
[StringLength(50)]
public string LastName { get; set; }
public IEnumerable<SelectListItem> RolesList { get; set; }
}
编辑用户视图
<div class="form-group">
@Html.Label("Roles", new { @class = "control-label col-md-2" })
<span class="col-md-10">
@foreach (var item in Model.RolesList)
{
<input type="checkbox" name="SelectedRole" value="@item.Value"
checked="@item.Selected" class="checkbox-inline" />
@Html.Label(item.Value, new { @class = "control-label" })
}
</span>
</div>
如果你想转换为字符串,你可以使用 String.Join 并使用string.Empty、null或任何你想要的分隔符作为分隔符,但会包含在你的字符串中。
string str = string.Join(string.Empty, yourArray)
这是书中的一个错别字,或者从书中复制时的错别字,应该是:"空"、"空 "或任何你想要的分隔符,但会包含在你的字符串中。应该是这样的。
var result = await _userManager.AddToRolesAsync(user.Id,
selectedRole.Except(userRoles).ToArray<string>());
应该是: AddToRolesAsync
需要 IEnumerable<string>
作为其第二个参数。AddToRoleAsync
取一个字符串。