2011-05-11 23 views
5

我有一個呈現WebGrid的部分視圖。我的控制器看起來像如何更改WebGrid獲取數據的操作(.NET MVC3)

public ActionResult Index() 
{ 
    return View(); 
} 
public ActionResult GetUserList(int? page, string sort, string sortdir) 
{ 
    var model = UserModel.getList(page,sort,sortdir); 
    return PartialView("_UserList",model); 
} 

Index.cshtml:
....
@Html.Action("GetUserList")

的問題是,我每次點擊網格導航或排序鏈接,它調用Index方法。如何讓Webgrid執行不同的操作(在這種情況下爲GetUserList)?我敢肯定,我可以使用jquery爲網格中的所有鏈接添加GetUserList,但我相信它應該是更好的方法。
這也可能是我所做的完全錯誤,所以謝謝你的建議。

回答

5

經過大量的揣測和挖掘(甚至用WebGrid的源代碼來擺弄Reflector)後,我得出結論:使用WebGrid,您無法控制/更改Header鏈接操作。

要創建標題鏈接URL,路徑是從HttpContext.Request.Path拍攝,所以沒有辦法來定製它指向一個不同的路線。

一個非常醜陋的黑客將進軍到jQuery的阿賈克斯的事件(因爲標題鏈接使用jQuery.load排序),並覆蓋網址:

<a href="#" onclick="$('#myGrid').load('/?sort=AlbumId&amp;sortdir=ASC&amp;__=634486582282704242 #myGrid');">Album Id</a> 

更好的解決辦法是使用:

  • Telerik的網格,它可以讓你指定custom routes也渲染布局
  • MvcContrib Grid(未提供更大的靈活性當然,如果這可以讓你修改標題鏈接,但絕對比WebGrid提供更大的靈活性)
+0

我不認爲這有助於按原始問題進行排序或分頁...... – 2011-08-10 14:34:22

+0

@JP:你說得對。我做了一些挖掘,並用調查結果更新了我的答案。 – Mrchief 2011-08-11 15:44:14

+0

很好的答案,謝謝! – 2011-08-11 15:47:07

2

@MrChief有關於醜陋的黑客的想法...我把它放在一起。這是我用來做這件事的主要代碼。事實上,它確實在將ajax呼叫掛上電話之前劫持了它。關鍵是修改發送的URL,因爲網格將從HttpContext.Request.Path中獲取該URL。並將其插入錨點元素的onclick。

我要把它放到我的主要common.js和只會附加功能來捕捉這恰好在發送數據之前的ajaxSend事件。

// Used to hijack the sending of all AJAX calls. Before it sends the call to the server, it checks to see if the 
// active element (the element that prompted the call) is marked with a given class. If so, then it will perform 
// the given operation. 
$(document).ajaxSend(function (event, jqXHR, ajaxOptions) { 

    var activeElement = document.activeElement; 

    if ($(activeElement).attr('redosorturl') != null) { 

     // If this is a sort anchor link from a grid that needs to have the sort link redone, do it here. 
     // the code is in the eipGrip.js file. 
     if ($(activeElement).attr('redosorturl').toString() == 'redoSortURL') { 
      var newURL = RedoGridSortURL(activeElement, ajaxOptions.url.toString()); 
      ajaxOptions.url = newURL.toString(); 
     } 
    } 

    return false; 
}); 

渲染頁面的時候,我也標誌着在列標題包含一個名爲「redosorturl」類不正確的URL的標籤,所以我知道當我劫持了Ajax調用,操作必須建立在做這個元素,然後我調用一個自定義函數,給了我正確的URL,然後ajaxOptions.url然後被重寫與該新的URL

我必須將activeElement傳遞到該重寫函數,所以我可以遍歷DOM獲取網格信息,在這裏我放置了像控制器和動作方法一樣的數據,以及用於URL的ID和其他信息。同樣,我傳遞當前的url字符串,因爲網格會注入一個令牌一個t我分析並放在新網址上的url結尾。

2

你的結論是不正確的。你只需要來包裝你的WebGrid在GET形式:

using (Html.BeginForm("GetUserList", "ThingaMaBob", System.Web.Mvc.FormMethod.Get)) 
{ 
var grid = new WebGrid(
... 
)); 

    Html.Hidden(grid.SortFieldName, grid.SortColumn); 
    Html.Hidden(grid.SortDirectionFieldName, grid.SortDirection == SortDirection.Ascending ? "ASC" : "DESC"); 
} 

的hiddens是,這樣的排序目錄和排序字段在查詢字符串解析的形式而告終。你最終像本地主機/ ThingaMaBob/GetUserList?someotherfields =網址,不管= &排序=城市& sortdir = ASC

+0

我試過了,它不起作用。使用Mvc4 – Kelmen 2013-12-03 07:57:21

+0

不知道該說些什麼......這就是我們在生產網格中所擁有的。 – 2013-12-03 23:31:59

0

如果刪除[HttpPost]屬性,讓路線得出相同的功能。你會在你的方法中找到Request [「page」]值。這將允許您對Request [「Page」]值進行檢查。