如何更改WebGrid操作以获取数据(.NET MVC3)

时间:2011-05-11 17:26:25

标签: asp.net-mvc-3 webgrid

我有一个呈现WebGrid的部分视图。我的控制器看起来像

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添加到网格中的所有链接,但我相信它应该是更好的方法。
   我正在做的事情也可能是完全错误的,所以感谢您的建议。

4 个答案:

答案 0 :(得分:5)

经过大量的讨论和挖掘(甚至用WebGrid的源代码摆弄Reflector),我得出的结论是,使用WebGrid,您无法控制/更改Header链接操作。

要创建标题链接网址,路径取自HttpContext.Request.Path,因此无法将其自定义为指向其他路线。

一个非常丑陋的黑客将利用jQuery Ajax的事件(因为标题链接使用jQuery.load进行排序)并覆盖URL:

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

更好的解决方案是使用:

  • Telerik Grid,可让您指定custom routes,并在呈现布局方面提供更大的灵活性
  • MvcContrib Grid(不确定这是否允许您修改标题链接,但绝对比WebGrid提供更多灵活性)

答案 1 :(得分: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,然后用新的URL重写ajaxOptions.url。

我必须将activeElement传递给该重写函数,这样我就可以遍历DOM以获取网格信息,我在其中放置了数据,如控件和操作方法,以及我使用的ID和其他信息用于URL。同样,我传入当前的url字符串,因为网格会在我解析并放在新网址的网址末尾注入一个标记。

答案 2 :(得分:2)

你的结论不对。您只需将Web网格包装在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是这样的,排序目录和排序字段在查询字符串中以可解析的形式结束。你最终得到像localhost / ThingaMaBob / GetUserList这样的网址?someotherfields = whatever =&amp; sort = city&amp; sortdir = ASC

答案 3 :(得分:0)

如果删除[HttpPost]属性并让路由达到相同的功能。您将在方法中找到请求[&#34; page&#34;]值。这将允许您检查请求[&#34; Page&#34;]值。