代码之家  ›  专栏  ›  技术社区  ›  Michael Dubakov

在.NET3.5中,将ExtJS与Asp.net和WCF结合使用的最佳实践是什么?

  •  2
  • Michael Dubakov  · 技术社区  · 16 年前

    如何从ExtJS表单保存数据?将数据从业务层加载到表单或网格中?

    6 回复  |  直到 16 年前
        1
  •  5
  •   Adam Bellaire    16 年前

    对我来说,我使用了ASHX页面来直接推送XML,然后使用ExtJS数据读取器来读取。。然后,假设使用表单等,我将表单数据直接推回到另一个ASHX页面,以询问/发布到DB。。如果我知道最好的方法,那就糟糕了——但它适合我,而且看起来非常快速和稳定,最重要的是它更容易遵循/调试。

    下面是一些代码示例,如果它有帮助的话。。。希望不要妨碍!

    获取数据

        // 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
    

    好的,我这里有一些额外的代码,可以在网格顶部创建一个工具栏,您可以忽略它。。。

        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页面,然后发送到DB。。。

            //  ---------------------------------------------------------------------------------------------
            //  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对象进行访问。。我知道有一种方法可以将表单数据以XML的形式发布到ASHX页面,尽管出于我的目的,它不是必需的——非常简单的表单。

            //  ---------------------------------------------------------------------------------------------
            //  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();
    

    再一次,希望这能有所帮助-我花了几个星期才做到!!可能对编码来说太老了!

        2
  •  2
  •   Robert Koritnik Robert Koritnik    16 年前

    我们使用ExtJS和WCF的组合获得了巨大的成功。我们使用常规的Asp.net页面来提供主题、身份验证和基本页面UI,然后ExtJS在客户端启动,向WCF服务发出GETs,该服务返回纯简单的裸格式JSON(不带“d”属性)。真的很棒。WCF服务也是同一web应用程序的一部分,因此在整个web应用程序中使用了用户身份验证/授权。

    我们遇到的唯一问题是返回文件的页面和同时使用Ajax和常规Asp.net回发的页面。我们必须在这些往返中处理ExtJS控件持久性。但我们还是成功了。

    ExtJS+WCF工作得很好,我建议任何使用类似于Windows应用程序的web应用程序的人使用它。只是不要使用常规asp.net页面功能和Ajax组合使项目过于复杂。或者更新面板。

        3
  •  1
  •   Marko Dumic    16 年前

    我仅通过web服务将ExtJs与ASP.NET结合使用。如果你愿意在没有“页面”之类的东西的情况下工作,它就可以正常工作。

        6
  •  0
  •   mono mono    15 年前

    如果您有兴趣通过gwt使用java开发Extjs,您可以在这个Extjs gwt gxt博客上了解更多信息。也许对你有帮助 How to setup Ext js-GWT : GXT and Example on Eclipse Ganymede 3.4