2014-07-09 37 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)); 
}