我是MVC的新手。以下是我在观点上所做的事情的要点:
使用指定的用户角色显示身份用户。
克隆用户角色页面部分:
有一个SelectList,最终用户可以选择其他一些身份用户。
显示所选用户当前的用户角色 - 我在部分视图中使用它。
拥有克隆用户按钮并单击以删除当前显示的用户的所有用户角色,然后将其添加到所选用户的所有角色中 SelectList被分配给。
我让View以我想要的方式运行,但有一个例外 - 在更改用户的身份角色后(通过单击克隆用户链接),我的View部分不会刷新以显示新角色。在我的ViewModel中,这将是UserRoles。如果我按CTRL + F5刷新,那么我会看到最新的角色。
这是我的ViewModel:
public ApplicationUser AppUser { get; set; }
public TblEmployee Employee { get; set; }
[Display(Name = "User Roles")]
public List<Tuple<string, string>> UserRoles { get; set; }
[Display(Name = "Available Roles")]
public List<Tuple<string, string>> AllRoles { get; set; }
[Display(Name = "Select Employee")]
public List<SelectListItem> EmployeeList { get; set; }
我的页面上有一个链接:
<a id="uxCloneUserButton" class="hidden">
<i class="glyphicon glyphicon-duplicate"></i> Clone User
</a>
然后在我的视图中我的脚本中有以下内容:
$('#uxCloneUserButton').click(function () {
var selectedId = $('#uxEmployeeSelect').val();
var appUserId = $('#uxHiddenAppUserId').val();
var url = '@Url.Action("CloneUser", "ApplicationUser")';
//post id and username to controller action
$.post(url, { id: appUserId, cloneUserId: selectedId }, function (data) {
});
});
我使用适当的参数进入控制器上的操作,它运行正常。在我的控制器中我有这个:
[HttpPost]
public async Task<IActionResult> CloneUser(string id, string cloneUserId)
{
ApplicationUser currentUser = await _userManager.FindByIdAsync(id);
ApplicationUser cloneUser = await _userManager.FindByIdAsync(cloneUserId);
//Remove currentUser from all current roles
var currentUserRoles = await _userManager.GetRolesAsync(currentUser);
if (currentUserRoles.Count > 0)
await _userManager.RemoveFromRolesAsync(currentUser, currentUserRoles.ToArray());
var cloneUserRoles = await _userManager.GetRolesAsync(cloneUser);
if (cloneUserRoles.Count > 0)
await _userManager.AddToRolesAsync(currentUser, cloneUserRoles.ToArray());
return RedirectToAction(nameof(Details), new { id = id });
}
非常感谢您的帮助。我只需要在点击后刷新页面的这一部分就可以了。我已经完成了设置。
我能够让它工作,但我的解决方案感觉不是一个好的。
我在ViewModel中添加了一个字符串:
public string JSRedirectLocation { get; set; }
我在详细信息操作中设置了属性,我在其中分配了所有VM属性:
//Redirect location
model.JSRedirectLocation = "/ApplicationUser/Details/" + model.AppUser.Id;
我在发布后将我的JavaScript更改为重定向:
//post id and username to controller action
$.post(url, { id: appUserId, cloneUserId: selectedId }, function (data) {
window.location = '@Model.JSRedirectLocation';
});
有人可以告诉我,我是否应该这样做一些更清洁的方式,拜托?在我看来,这个解决方案是多余的,感觉就像一个解决方法。感谢。
答案 0 :(得分:2)
你的请求是ajax调用,为此必须返回json,然后处理响应重定向到target.So in action use:
[HttpPost]
public async Task<IActionResult> CloneUser(string id, string cloneUserId)
{
//.. your code
var redirectUrl = Url.Action(nameof(Details), new { id = id });
return Json(new {
redirectUrl = redirectUrl
});
}
并在ajax调用中使用以下代码:
$.post(url, { id: appUserId, cloneUserId: selectedId }, function (data) {
window.location = data.redirectUrl;
});