我有一个用户 ListView ,其中包含一个用于显示用户的 foreach。
用户名可通过以下方式点击:
@Html.ActionLink(item.UserName, "UserSetAccess", new { id=item.Id }, new{ @class = "dialog" } )
渲染的 HTML:
<a href="/Admin/UserSetAccess/37ebbad8-c952-4a75-91d2-197d78d1b175" class="dialog">testCustomer7@example.com</a>
单击链接会触发此 jQuery:
$(function () {
$('a.dialog').click(function () {
var url = $(this).attr('href');
var dialog = $('<div style="display:none"></div>').appendTo('body');
dialog.load(url, {},
function (responseText, textStatus, XMLHttpRequest) {
dialog.dialog({
close: function (event, ui) {
dialog.remove();
}
});
});
return false;
});
});
没有<form>
标签在此页面上,但我已经在 Controller 中的 GET 和 POST UserSetAccess 操作上设置了断点,唯一被击中的是 POST,它弄乱了对话框。
为什么 .load() 发出 POST 而不是 GET?该对话框最初应该弹出并包含来自 GET 的 View ,然后允许更改,以便我可以提交它们并执行 POST。
有人发现上述代码有问题吗?或者有其他方法可以使其正常工作吗?我研究了 .load() 并且没有看到任何地方说它发出了 POST。
编辑
根据请求,我包含了 Controller 操作方法。这两者几乎都是默认的。我注释掉了 POST 操作上的 ValidateAntiForgeryToken 属性,因为它出错了 - 可能与我的问题属于同一问题。我稍后会解决这个问题。
获取 Controller 操作:
//
// GET: /Admin/UserSetAccess/1
public async Task<ActionResult> UserSetAccess(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var user = await UserManager.FindByIdAsync(id);
if (user == null)
{
return HttpNotFound();
}
var userRoles = await UserManager.GetRolesAsync(user.Id);
return View(new UserProfileViewModel()
{
Id = user.Id,
Email = user.Email,
IsApproved = user.IsApproved,
Name = user.Name,
Company = user.Company,
RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
{
Selected = userRoles.Contains(x.Name),
Text = x.Name,
Value = x.Name
})
});
}
POST Controller 操作:
//
// POST: /Admin/UserSetAccess/5
[HttpPost]
//[ValidateAntiForgeryToken]
public async Task<ActionResult> UserSetAccess([Bind(Include = "Email,Id,IsApproved,Name,Company")]
UserProfileViewModel editUser, params string[] selectedRole)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByIdAsync(editUser.Id);
if (user == null)
{
return HttpNotFound();
}
user.UserName = editUser.Email;
user.Email = editUser.Email;
user.IsApproved = editUser.IsApproved;
user.Name = editUser.Name;
user.Company = editUser.Company;
var userRoles = await UserManager.GetRolesAsync(user.Id);
selectedRole = selectedRole ?? new string[] { };
var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray<string>());
if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray<string>());
if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
return RedirectToAction("Users");
}
ModelState.AddModelError("", "Something failed.");
return View();
}
最佳答案
发生 POST
的原因是您将一个对象传递给 .load()
方法。来自 jQuery documentation :
The POST method is used if data is provided as an object; otherwise, GET is assumed.
您的代码应该如下所示:
$(function () {
$('a.dialog').click(function () {
var url = $(this).attr('href');
var dialog = $('<div style="display:none"></div>').appendTo('body');
dialog.load(url,
function (responseText, textStatus, XMLHttpRequest) {
dialog.dialog({
close: function (event, ui) {
dialog.remove();
}
});
});
return false;
});
});
请注意,我在 .load()
调用中省略了 {}
。
关于jquery - 使用 Bootstrap Modal 通过 MVC5/razor 显示 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24565084/