来自控制器的MVC @ Html.ActionLink no-op

时间:2014-07-09 19:16:21

标签: c# .net asp.net-mvc asp.net-mvc-5

我在部分视图中有一个@Html.ActionLink,点击后我想要将用户发送到另一个视图,或者保持当前视图而不更改任何内容。这可能吗?

我们的控制器看起来像:

public ActionResult Edit(int id)
{
    if (ShouldAllowEdit(id))
    {
      return this.View("Edit", ...edit stuff...)              
    }

    return ????????
}

我们尝试return new EmptyResult();,但只是将用户转储到空白页面。

3 个答案:

答案 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));
}