我有一个呈现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
添加到网格中的所有链接,但我相信它应该是更好的方法。
我正在做的事情也可能是完全错误的,所以感谢您的建议。
答案 0 :(得分:5)
经过大量的讨论和挖掘(甚至用WebGrid的源代码摆弄Reflector),我得出的结论是,使用WebGrid,您无法控制/更改Header链接操作。
要创建标题链接网址,路径取自HttpContext.Request.Path
,因此无法将其自定义为指向其他路线。
一个非常丑陋的黑客将利用jQuery Ajax的事件(因为标题链接使用jQuery.load进行排序)并覆盖URL:
<a href="#" onclick="$('#myGrid').load('/?sort=AlbumId&sortdir=ASC&__=634486582282704242 #myGrid');">Album Id</a>
更好的解决方案是使用:
答案 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;]值。