Возвращение Gridview из AJAX WebMethod - PullRequest
0 голосов
/ 11 октября 2011

Через некоторое время я понял, что с помощью AJAX Control Toolkit вы можете в конечном итоге сделать гораздо больше, чем с помощью jquery. Поэтому я начал использовать jquery ajax вместо элементов управления updatepanels и т. Д., И это выглядит намного быстрее и менее сложно.

У меня есть один вопрос: у меня был вид сетки с подкачкой внутри панели обновления, и была кнопка ссылки, которая снова брала строки из БД и снова привязывала вид сетки. Теперь я хочу использовать веб-метод.

Есть ли способ вернуть это из webmethod? Может быть много других случаев, когда, скажем, у меня есть элемент управления .ascx внутри updatepanel. Есть ли способ вернуть и такие элементы управления? Любые примеры ссылок приветствуются

Спасибо

Ответы [ 3 ]

5 голосов
/ 11 октября 2011

Вы не должны возвращать GridViews из WebMethods.Вы должны вернуть данные и связать их на стороне клиента с помощью jQuery.

Если вы хотите полностью заменить GridView, я рекомендую вам использовать какой-нибудь плагин jQuery для отображения данных в табличной форме.Вы можете посмотреть jQGrid или datatables (мой любимый).Ваш веб-метод может вернуть только данные в формате Json.Что-то вроде:

[WebMethod]
public List<CustomObject> GetData(string param1, string param2)
{
    //return data here
}

В конкретном случае таблиц данных есть интерфейс , который вы должны придерживаться.В моей версии C # это будет выглядеть примерно так:

public class ResponseData 
{
    #region properties
    public int iTotalRecords { get; set; } //used by datatables to build the pager
    public int iTotalDisplayRecords { get; set; } //used by datatables to build the pager
    public string sEcho { get; set; }
    public string sColumns { get;set; } //optional
    public List<CustomObject> aaData { get; set; } //your actual business objects
    #endregion        
}

Так что ваш веб-метод, если вы решите использовать таблицы данных, должен вернуть ResponseData

[WebMethod]
public ResponseData GetData(string param1, string param2)
{
    //return ResponseData
}

Вы бы связалиданные на стороне клиента делают что-то вроде это:

 $(document).ready(function() {
            var oTableSummary = $("#tbl").dataTable({
                "bJQueryUI": true,
                "bPaginate": false,
                "sPaginationType": "full_numbers",
                "bServerSide": true,
                "bProcessing": true,
                "iDisplayLength": 50,
                "bFilter": false,
                "bSortClasses": false,
                "bDeferRender": false,
                "oLanguage": { "sSearch": "Search all columns:" },
                "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
                "sAjaxSource": "WebService.asmx/GetData",
                "fnServerData": function(sSource, aoData, fnCallback) {
                    $.ajax({
                        "type": "POST",
                        "dataType": 'json',
                        "contentType": "application/json; charset=utf-8",
                        "url": sSource,
                        "data": "{'param1': 'param1" , 'param2': 'param2' }",
                        "success": function(result) {
                            fnCallback(result); // draw the table
                        }
                    });
                }
            });
        });

PS: вам придется потратить немало времени на изучение этого материала, но если вы освоите его, вы не захотите идтивернуться к использованию серверных элементов управления.: D

1 голос
/ 11 октября 2011

Я не буду пытаться вернуть серверные элементы управления из веб-методов. На первый взгляд может показаться, что объем кода уменьшается, но в долгосрочной перспективе я думаю, что это создаст больше кода и больше головной боли. Например, как вы планируете получить доступ к элементам управления, привязанным к ним данным или их событиям в выделенном коде? Снижение размера разметки - это здорово, но не за счет выделенного кода.

Иногда, как разработчики, мы склонны зацикливаться на новых технологиях, когда учимся их применять, и я думаю, что это один из таких случаев.

1 голос
/ 11 октября 2011

У вас может быть веб-метод, который возвращает строку.Эта строка будет содержать весь HTML-код, отображаемый вашим элементом управления с помощью this или this подхода.А на стороне клиента вы можете просто заменить держатель таблицы новым контентом (это то, что в основном делает панель обновления).

Но лучше всего передавать только данные, а не все html.Возможно, некоторые jquery grid plugins помогут немного.

...