Как изменить действие WebGrid для получения данных (.NET MVC3) - PullRequest
5 голосов
/ 11 мая 2011

У меня есть частичное представление, которое отображает 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:
....<br> @Html.Action("GetUserList")
Проблема в том, что каждый раз, когда я нажимаю на навигацию по сетке или сортирую ссылки, он вызывает Index метод.Как я могу заставить Webgrid выполнить другое действие (GetUserList в этом случае)?Я уверен, что могу добавить GetUserList ко всем ссылкам в сетке, используя jquery, но я считаю, что это должен быть лучший способ.
Также возможно, что то, что я делаю, совершенно неправильно, так что спасибо за ваши предложения.

Ответы [ 4 ]

5 голосов
/ 10 августа 2011

После многих манипуляций и копания (и даже возни с Reflector с исходным кодом WebGrid) я пришел к выводу, что с WebGrid вы не можете контролировать / изменять действие ссылки Header.

Для создания URL ссылки на заголовок путь берется из 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, который позволяет вам указать пользовательских маршрутов , а также предлагает гораздо большую гибкость при рендеринге вашего макета
  • или MvcContrib Grid (не уверен, позволяет ли это изменять ссылки на заголовки, но определенно предлагает большую гибкость, чем WebGrid)
2 голосов
/ 23 июня 2012

Ваш вывод неверен. Вам просто нужно обернуть свою сетку в форму Получить:

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");
}

Скрытые значения таковы, что поля sort dir и sort заканчиваются в разбираемой форме в строке запроса. Вы получите URL-адреса, такие как localhost / ThingaMaBob / GetUserList? Someotherfields = что бы то ни было = & sort = city & sortdir = ASC

2 голосов
/ 14 декабря 2011

@ У мистера Чифа была идея о безобразном хаке ... Я соединил это.Вот основной код, который я использовал для этого.Он действительно захватывает вызов ajax до того, как он подключен к сети.Ключ заключается в том, чтобы изменить отправляемый URL-адрес, поскольку сетка будет извлекать этот URL-адрес из HttpContext.Request.Path.и подключите его к щелчку для элемента привязки.

Я помещаю это в свой основной файл 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;
});

При рендеринге страницы я пометил тег в заголовке столбца, который содержит неверный URL, с именем класса "redosorturl", поэтому я знаю, что когда я перехватываю вызов ajax, операция должна выполняться с этим элементомЗатем я вызываю пользовательскую функцию, которая дает мне правильный URL, затем ajaxOptions.url переписывается с этим новым URL.

Я должен передать activeElement этой функции перезаписи, чтобы я мог пройти DOMчтобы получить информацию о сетке, куда я поместил данные, такие как контроллер и метод действия, которые используются вместе с идентификаторами и другими данными, которые я использую для URL. Аналогично, я передаю текущую строку URL, потому что сетка будет вводить токенв конце URL, который я анализирую и добавляю новый URL.

0 голосов
/ 23 апреля 2015

Если вы удалите атрибут [HttpPost] и позволите маршруту перейти к той же функции. вы найдете значение Request ["page"] в вашем методе. это позволит вам поставить галочку в значении Request ["Page"].

...