我在部分视图中有一个@Html.ActionLink
,点击后我想要将用户发送到另一个视图,或者保持当前视图而不更改任何内容。这可能吗?
我们的控制器看起来像:
public ActionResult Edit(int id)
{
if (ShouldAllowEdit(id))
{
return this.View("Edit", ...edit stuff...)
}
return ????????
}
我们尝试return new EmptyResult();
,但只是将用户转储到空白页面。
答案 0 :(得分:2)
这是一个与此问题略有不同的方法,但它应该做你想要的。
不是向用户提供导航到的链接,而是在链接/按钮单击时执行ajax调用,然后执行id检查。返回要在JsonResult中导航到的url,如果id无效,则返回任何内容。
在返回ajax调用时,如果适用,请导航到url。
(在示例中用你的ShouldAllowEdit函数替换硬编码的id和== 0)
在视图中:
<div class="btn btn-danger" id="myButton">Button</div>
@section scripts{
<script>
$("#myButton").click(function () {
$.ajax("@Url.Action("Edit", new { id = 0 })", { type : "POST" })
.success(function (data) {
if (data.url !== "") {
window.location.href = data.url;
}
});
});
</script>
}
在控制器中:
[HttpPost]
public JsonResult Edit(int id)
{
if (id == 0)
{
return Json(new {url = ""});
}
else
{
return Json(new { url = Url.Action("EditPage", new { id = id }) });
}
}
答案 1 :(得分:0)
如果用户点击链接,他们将带走。它们可能会被发送回同一页面,但页面将卸载,再次从服务器请求,然后在浏览器中重新呈现。如果您不希望这种情况发生,那么您首先不会向用户提供链接。换句话说,根据用户的角色或其他条件有条件地呈现链接。
@if (userCanEdit)
{
@Html.ActionLink(...)
}
userCanEdit
是你需要做出决定的逻辑。
如果用户未通过您确定的任何检查,则他们无法获得该链接。简单。
然而,由于世界上有恶意的人,你不能完全把它留在那里。用户可以找出编辑内容的链接并手动转到那里。因此,为了防止您在操作中检查编辑权限(就像您已经在代码示例中获得的那样),但是如果不允许该用户,那么您只需返回一个禁止的状态代码:
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
或者
return new HttpStatusCodeResult(403);
他们都做同样的事情。
<强>更新强>
根据您上面的评论,似乎用户通常允许编辑但不能在特定实例中进行编辑,因为其他用户正在编辑。在这种情况下,403 Forbidden是不合适的,所以你真正得到的只是一个简单的重定向回到他们所在的页面,或许有一条消息解释他们为什么会回到那里。
TempData["EditErrorMessage"] = "Sorry another user is editing that right now.";
return RedirectToAction("Index");
答案 2 :(得分:0)
答案是重定向到视图操作 - 并且可能会给出一些反馈它们失败的原因。
public ActionResult Edit(int id)
{
if (ShouldAllowEdit(id))
{
return this.View("Edit", ...edit stuff...)
}
ModelState.AddModelError("id", "Not allowed to edit this item");
return RedirectToAction(Edit(id));
}