Как лучше всего использовать ExtJS с Asp.net и WCF в .NET 3.5?

Как вы сохраняете данные из формы ExtJS? Загрузить данные из бизнес-уровня в форму или сетку?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
10 112
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я использовал Ext Js вместе с ASP.NET только через веб-службы. Он отлично работает, если вы готовы работать без «Пейджа» и всего такого.

Не могли бы вы привести несколько примеров?

Michael Dubakov 09.10.2008 13:05

Не могли бы вы уточнить, что именно вам нужно?

Marko Dumic 10.10.2008 02:46
Ответ принят как подходящий

Скорее всего нашел лучшее решение http://developmentalmadness.blogspot.com/2008/07/using-extjs-with-wcf.html

блог переехал, вот новый URL: developmentalmadness.com/archive/2008/07/17/…

Mark J Miller 25.08.2009 16:15

Для меня я использовал страницу ASHX для отправки прямого XML - а затем использую средство чтения данных ExtJS для чтения ... затем, скажем, используя форму и т. д., Я отправляю данные формы прямо обратно на другую страницу ASHX, чтобы опросить / опубликовать на БД ... черт возьми, знаю ли я лучший способ - но он меня устраивает и кажется очень быстрым и стабильным, и, что наиболее важно, его легче отслеживать / отлаживать.

Вот пример кода, если это поможет ... надеюсь, не помешает!

ПОЛУЧЕНИЕ ДАННЫХ

Как вы увидите, URL-адрес для получения данных получает простую страницу .NET ASHX (общий обработчик), которая будет возвращать прямой XML ...

    // Define the core service page to get the data (we use this when reloading)
    var url = '/pagedata/getbizzbox.ashx?duration=today';

    var store = new Ext.data.GroupingStore(
    {
        //  Define the source for the bizzbox grid (see above url def). We can pass (via the slider)
        //  the days param as necessary to reload the grid
        url: url,

        //  Define an XML reader to read /pagedata/getbizzbox.ashx XML results
        reader: new Ext.data.XmlReader(
        {
            //  Define the RECORD node (i.e. in the XML <record> is the main row definition), and we also
            //  need to define what field is the ID (row index), and what node returns the total records count
            record: 'record',
            id: 'inboxID',
            totalRecords: 'totalrecords'
        },
            //  Setup mapping of the fields                         
        ['inboxID', 'messageCreated', 'subject', 'message', 'messageOpened', 'messageFrom', 'messageFromID', 'groupedMessageDate']),

        //  Set the default sort scenario, and which column will be grouped
        sortInfo: { field: 'groupedMessageDate', direction: "DESC" },
        groupField: 'groupedMessageDate'

    }); // end of Ext.data.store

ДАННЫЕ ДЛЯ СЕТКИ EXTJS

Хорошо, у меня здесь есть дополнительный код, который создает панель инструментов в верхней части сетки, которую вы можете игнорировать ...

    var grid = new Ext.grid.GridPanel(
    {
        // Define the store we are going to use - i.e. from above definition
        store: store,

        // Define column structs

        // { header: "Received", width: 180, dataIndex: 'messageCreated', sortable: true, renderer: Ext.util.Format.dateRenderer('d-M-Y'), dataIndex: 'messageCreated' },

        columns: [
            { header: "ID", width: 120, dataIndex: 'inboxID', hidden: true },
            { header: "Received", width: 180, dataIndex: 'messageCreated', sortable: true },
            { header: "Subject", width: 115, dataIndex: 'subject', sortable: false },
            { header: "Opened", width: 100, dataIndex: 'messageOpened', hidden: true, renderer: checkOpened },
            { header: "From", width: 100, dataIndex: 'messageFrom', sortable: true },
            { header: "FromID", width: 100, dataIndex: 'messageFromID', hidden: true },
            { header: "Received", width: 100, dataIndex: 'groupedMessageDate', hidden: true }
        ],

        //  Set the row selection model to use
        gridRowModel: new Ext.grid.RowSelectionModel({ singleSelect: true }),

        // Set the grouping configuration
        view: new Ext.grid.GroupingView(
        {
            forceFit: true,
            groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Messages" : "Message"]})'
        }),

        // Render the grid with sizing/title etc
        frame: true,
        collapsible: false,
        title: 'BizzBox',
        iconCls: 'icon-grid',
        renderTo: 'bizzbox',
        width: 660,
        height: 500,
        stripeRows: true,

        //  Setup the top bar within the message grid - this hosts the various buttons we need to create a new
        //  message, delete etc
        tbar: [

            //  New button pressed - show the NEW WINDOW to allow a new message be created
            {
                text: 'New',
                handler: function()
                {
                    //  We need to load the contacts, howver we only load the contacts ONCE to save
                    //  bandwidth - if new contacts are added, this page would have been destroyed anyway.
                    if (contactsLoaded==false)
                    {
                        contactStore.load();
                        contactsLoaded=true;
                    }
                    winNew.show();
                }
            },

            //  Delete button pressed
            //  We need to confirm deletion, then get the ID of the message to physically delete from DB and grid
            {
                text: 'Delete', handler: function() 
                {
                    Ext.MessageBox.confirm('Delete message', 'are you sure you wish to delete this message?', function(btn) {

                    //  If selected YES, get a handle to the row, and delete
                    if (btn == 'yes') 
                    {
                        //  Get the selected row
                        var rec = grid.getSelectionModel().getSelected();
                        if (rec==null)
                        {
                            Ext.Msg.show(
                            {
                               title:'No message selected',
                               msg: 'please ensure you select a message by clicking once on the required message before selecting delete',
                               buttons: Ext.Msg.OK,
                               icon: Ext.MessageBox.QUESTION
                            });
                        }

                        //  Proceed to delete the selected message
                        else
                        {
                            var mesID = rec.get('inboxID');

                            //  AJAX call to delete the message
                            Ext.Ajax.request(
                            {
                                url: '/postdata/bizzbox_message_delete.ashx',
                                params: { inboxID: mesID },

                                //  Check any call failures
                                failure: function() 
                                {
                                    Ext.Msg.show(
                                    {
                                        title: 'An error has occured',
                                        msg: 'Having a problem deleting.. please try again later',
                                        buttons: Ext.Msg.OK,
                                        icon: Ext.MessageBox.ERROR
                                    })
                                }, // end of failure check

                                //  Success check
                                success: function()
                                {
                                    //  Need to remove the row from the datastore (which doesn't imapct
                                    //  a reload of the data)
                                    store.remove(rec);
                                }
                            }); // end if delete ajax call

                        } // end of ELSE for record selected or not

                    } // end of YES button click
                })
            } // end of delete button pressed
        }] // end of tbar (toolbar def)

    }); // end of grid def

РАЗМЕЩЕНИЕ ДАННЫХ ИЗ ФОРМЫ НА НАЗАД

Опять же, обратите внимание на URL-адрес в первой части определения ... собираюсь отправить опубликованные данные формы обратно на другую страницу ASHX, чтобы затем отправить в БД ...

        //  ---------------------------------------------------------------------------------------------
        //  DEFINE THE REPLY FORM
        //  This is used to show the existing message details, and allows the user to respond
        //  ---------------------------------------------------------------------------------------------
        var frmReply = new Ext.form.FormPanel(
        {
            baseCls: 'x-plain',
            labelWidth: 55,
            method: 'POST',
            url: '/postdata/bizzbox_message_reply.ashx',

            items: [
            {
                xtype: 'textfield',
                readOnly: true,
                fieldLabel: 'From',
                name: 'messageFrom',
                value: selectedRow.get('messageFrom'),
                anchor: '100%'  // anchor width by percentage
            },
            {
                xtype: 'textfield',
                readOnly: true,
                fieldLabel: 'Sent',
                name: 'messageCreated',
                value: selectedRow.get('messageCreated'),
                anchor: '100%'  // anchor width by percentage
            },
            {
                xtype: 'textarea',
                selectOnFocus: false,
                hideLabel: true,
                name: 'msg',
                value: replyMessage,
                anchor: '100% -53'  // anchor width by percentage and height by raw adjustment
            },

            //  The next couple of fields are hidden, but provide FROM ID etc which we need to post a new/reply
            //  message to
            {
                xtype: 'textfield',
                readOnly: true,
                fieldLabel: 'subject',
                name: 'subject',
                hidden: true,
                hideLabel: true,
                value: selectedRow.get('subject')
            },
            {
                xtype: 'textfield',
                readOnly: true,
                fieldLabel: 'FromID',
                name: 'messageFromID',
                hidden: true,
                hideLabel: true,
                value: selectedRow.get('messageFromID')
            },
            {
                xtype: 'textfield',
                readOnly: true,
                fieldLabel: 'InboxID',
                name: 'inboxID',
                hidden: true,
                hideLabel: true,
                value: selectedRow.get('inboxID')
            }]
        });  // end of frmReply

ПОСЛЕДНЯЯ ЧАСТЬ, ЧТОБЫ ПЕРЕМЕСТИТЬ ВЫШЕУЮ ФОРМУ НА ОБРАТНУЮ ...

Это окно использует определение формы, приведенное выше, для фактической отправки данных .. на странице ASHX данные просто передаются как опубликованная форма - то есть вы можете получить доступ через обычный объект Request.form .. Я знаю, что есть способ по существу опубликовать формировать данные на страницу ASHX как XML, хотя для моей цели это не требовалось - довольно простая форма.

        //  ---------------------------------------------------------------------------------------------
        //  REPLY WINDOW - uses the frmReply as defined previously on stargate atlantis
        //  ---------------------------------------------------------------------------------------------
        var win = new Ext.Window(
        {
            title: selectedRow.get("subject"),
            width: 500,
            height: 300,
            minWidth: 300,
            minHeight: 200,
            layout: 'fit',
            plain: false,
            bodyStyle: 'padding:5px;',
            buttonAlign: 'right',
            items: frmReply,

            //  Add the action buttons for the message form
            buttons: [
            {
                //  When the user replies, we send the form results to the posting ashx which updates
                //  the DB etc, and returns the result
                text: 'reply',
                handler: function()
                {
                    frmReply.getForm().submit({ waitMsg: 'Sending your message now...' });
                }
            },
            {
                text: 'close',
                handler: function()
                {
                    //  We need to close the message window
                    win.close();
                }
            }]
        });

        //  Show the message detail window                      
        win.show();

Опять же, надеюсь, что это немного поможет - мне потребовалось несколько недель, чтобы добраться до этого !! возможно, слишком стареет для программирования!

Мы с большим успехом использовали комбинацию ExtJS и WCF. Мы использовали обычную страницу Asp.net для предоставления тем, аутентификации и базового пользовательского интерфейса страницы, а затем ExtJS включился на стороне клиента, выдав GET-запросы службам WCF, которые возвращали чистый простой простой формат JSON (без свойства «d»). Сработало действительно здорово. Службы WCF также были частью одного и того же веб-приложения, поэтому во всем нем использовалась аутентификация / авторизация пользователей.

Единственные проблемы, которые у нас были, были со страницами, возвращающими файлы, и страницами, которые использовали комбинацию обоих: Ajax и обычных постбэков Asp.net. Мы должны были позаботиться о сохранении контроля ExtJS на этих циклах. Но мы все равно это сделали.

ExtJS + WCF отлично работал, и я бы порекомендовал его всем, кто делает веб-приложение, которое должно быть больше похоже на оконное приложение. Просто не усложняйте свой проект обычными функциями страницы asp.net и комбинацией Ajax. Или UpdatePanels тоже.

Если вы заинтересованы в разработке Extjs с помощью java от gwt, вы можете узнать больше в этом блоге extjs-gwt gxt. Это может тебе помочь Как настроить Ext js-GWT: GXT и пример на Eclipse Ganymede 3.4

Другие вопросы по теме