C# MVC@Html.ActionLink控制器无操作

C# MVC@Html.ActionLink控制器无操作,c#,.net,asp.net-mvc,asp.net-mvc-5,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 ???????? }

我在部分视图中有一个
@Html.ActionLink
,单击该视图时,我希望将用户发送到另一个视图,或者在不更改任何内容的情况下保持当前视图。这可能吗

我们的控制器看起来像:

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

    return ????????
}

我们尝试了
返回新的EmptyResult()但这只会将用户转储到空白页

如果用户单击链接,它们将被删除。它们可能会被发送回同一页面,但该页面将被卸载,再次从服务器请求,然后在浏览器中重新呈现。如果您不希望这种情况发生,那么您首先不会给用户链接。换句话说,有条件地呈现链接与否取决于用户的角色或其他因素

 @if (userCanEdit)
 {
     @Html.ActionLink(...)
 }
其中,
userCanEdit
是做出该决定所需的任何逻辑

如果用户未通过您确定的任何检查,则他们无法获得链接。简单

然而,既然世界上有恶意的人,你不能把它完全留在那里。用户有可能找到链接来编辑某些内容并手动转到那里。因此,为了防止您在操作中检查编辑权限(就像您已经在代码示例中获得的权限),但是如果不允许用户,则您只需返回禁止状态代码:

return new HttpStatusCodeResult(HttpStatusCode.Forbidden);

他们都做同样的事情

更新

根据您上面的评论,用户通常可以编辑,但在特定实例中无法编辑,因为另一个用户正在编辑。在这种情况下,403 Forbidden是不合适的,所以实际上你所能做的只是简单地重定向到他们所在的页面,也许会有一条消息解释他们为什么会回到那里

TempData["EditErrorMessage"] = "Sorry another user is editing that right now.";
return RedirectToAction("Index");

答案是重定向到视图操作,并可能给出一些反馈,说明它们失败的原因

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

这是一个有点不同的方法来解决这个问题,但它应该做你想做的

不要给用户一个导航到的链接,而是在单击链接/按钮时进行ajax调用,并进行id检查。在JsonResult中返回要导航到的url,如果id无效,则不返回任何内容

在ajax调用返回时,如果合适,导航到url

(当然,在示例中,用shoulldAllowedIt函数替换硬编码的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>
}

如果他们可能无法编辑,为什么按钮可供他们点击?好问题@Shoe。这是为了在不进行某种活动刷新的情况下支持记录锁定。用户将看到他们试图编辑的东西当前被另一个用户锁定,但是如果它的状态在链接呈现后发生了变化(即被解锁),我们希望在他们单击链接时将他们带到编辑屏幕。我认为更好的方法是使用ajax,成功后它会从javascript重定向,否则什么也不做。这样,如果出现故障,页面状态的所有内容都将保持不变+1这样,页面在出现故障时将保持相同的状态我们在页面上有许多编辑链接,因此此策略最适合于特定于链接的
@Ajax.ActionLink
。谢谢
<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 }) });
    }
}