2014-07-09 33 views
1

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

我们的控制器的样子:

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

    return ???????? 
} 

我们试图return new EmptyResult();但只是转储用户一个空白页。

+0

为什么他们点击的按钮可能无法编辑? – Shoe

+0

伟大的问题@Shoe。这是为了支持没有某种主动刷新的记录锁定。用户将显示他们正在尝试编辑的内容目前被另一个用户锁定,但是如果由于链接已被渲染而导致状态已更改(即已解锁),我们希望在点击链接时将其带到编辑屏幕。 – Chris

+0

我认为一个更好的方法是使用Ajax,如果成功,它会从JavaScript重定向,否则什么也不做。这样,如果出现故障,页面状态的所有信息都保持不变 – Shoe

回答

2

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

而不是给用户一个链接导航到,做链接/按钮点击ajax调用,并做id检查。返回要在JsonResult中导航到的URL,或者如果ID无效,则返回任何内容。

在返回ajax调用时,导航到适当的url。

(交换出来的硬编码ID和过程的例子中的== 0与ShouldAllowEdit功能)

在View:

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

+1这样页面在失败时保持相同状态 – Shoe

+1

页面上有很多编辑链接,所以这种策略在'@ Ajax.ActionLink'上效果最好这可以是链接特定的。谢谢! – Chris

0

如果用户点击链接,他们会将带走。它们可能会被发送回同一页面,但页面将会卸载,再次从服务器请求,然后在浏览器中重新呈现。如果您不希望发生这种情况,您不会首先向用户提供链接。换句话说,有条件地渲染链接或不基于用户的角色或其他。

@if (userCanEdit) 
{ 
    @Html.ActionLink(...) 
} 

哪里userCanEdit是任何你需要的逻辑来作出这样的决定。

如果用户无法确定您所做的任何检查,那么他们不会获得链接。简单。

但是,由于世界上有恶意的人,所以不能完全放在那里。用户有可能找出编辑某些内容并手动进入的链接。因此,为防止您在行动检查的编辑权限(比如您已经在代码样本中有),但如果用户是不允许的,那么你只返回被禁止的状态代码:

return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 

return new HttpStatusCodeResult(403); 

它们都做同样的事情。

UPDATE

基于以上的评论,看来用户通常允许编辑,但不能在一个特定的实例,因为另一个用户编辑。 403 Forbidden在这种情况下并不合适,所以你真正拥有的只是一个简单的重定向回到他们所在的页面,或许用一条消息来解释他们为什么回到那里。

TempData["EditErrorMessage"] = "Sorry another user is editing that right now."; 
return RedirectToAction("Index"); 
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)); 
}