分享

extaspnet下的一些疑难杂症解决方案汇总

 绚爷好人图书馆 2014-06-24

最近一个web项目用到了extaspnet

这个开源的框架写的不错,很有潜力,但资料相对匮乏

所以在这里我把在QQ交流群里解答的一些网友问题也罗列在这边,方便大家查阅

我的开发环境:WIN7+VS2008+IE 8.0+MSSQL2000,其它浏览器主要测试Firefox和Chrome

 


 1.如何在后台动态修改window的宽度,高度?

答:基于extjs的页面AJAX创建机制,后台改一些控件的属性样式 不可透过传统的方法如:window1.width=600;要透过CSS

 

前台aspx(初始宽度设为600):    

  1. <ext:Window ID="Window1" runat="server" Height="350px" IsModal="true" Popup="false"  
  2.         Title="Window" CssStyle="width:600" IFrameUrl="test.aspx" EnableIFrame="true">  
  3. </ext:Window>  

 

 

后台(c#):

  1. protected void Button1_Click(object sender, EventArgs e)  
  2.         {            ExtAspNet.PageContext.RegisterStartupScript("Ext.getDom(" + Window1.ClientID + ").style.width=900;");  
  3.         }  

写法适用于extaspnet其它容器控件,比如说panel,form...

 


 

2.后台按钮触发时报JS错的怪异问题?

描述起来有点麻烦,页面有Toolbar,TabStrip,含2个tab,其中tab2有grid,其中一列为

<ext:CheckBoxField DataField="Selected" HeaderText="选择" RenderAsStaticField="false" />

当页面加载后直接触发toolbar按钮事件就会报一个JS的错误,但如果先手动切换tab2后,再触发就无碍,坑爹吧

 

答:grid的这列如果RenderAsStaticField="true"就不会报错,从JS报错分析,是grid上面的checkbox列未初始化(tab2未激活),既然通过手工切换tab(激活tab2)就可避免,我们用JS来实现即可

  1.     <mce:script type="text/javascript"><!--  
  2.         function onReady() {                          
  3.            var mainTabStrip = Ext.getCmp('<%= TabStrip1.ClientID %>');  
  4.            var tabID1 = '<%= Tab1.ClientID %>';  
  5.            var tabID2 = '<%= Tab2.ClientID %>';  
  6.            mainTabStrip.setActiveTab(tabID2);  
  7.            mainTabStrip.setActiveTab(tabID1);  
  8.         }  
  9.       
  10. // --></mce:script>  

 


 

3.tree放到了regionpanel中,就无法触发nodecommand的bug?

答:看上去又是一个控件bug,如何解决,调试控件源码,有耐心当然可以,没耐心咋办,换个思路

   

  1. protected void Page_Load(object sender, EventArgs e)  
  2.         {  
  3.             if (!IsPostBack)  
  4.             {  
  5.             }  
  6.             else  
  7.             {  
  8.                 if (Request.Form["__EVENTARGUMENT"] == "Command$n1$$")  
  9.                 {  
  10.                     ExtAspNet.Alert.Show("n1很蛋疼");  
  11.                 }  
  12.                 if (Request.Form["__EVENTARGUMENT"] == "Command$n2$$")  
  13.                 {  
  14.                     ExtAspNet.Alert.Show("n2很蛋疼");  
  15.                 }  
  16.                 if (Request.Form["__EVENTARGUMENT"] == "Command$n3$$")  
  17.                 {  
  18.                     ExtAspNet.Alert.Show("n3很蛋疼");  
  19.                 }  
  20.             }  
  21.         }  

 

   n1,n2,n3是tree中节点的nodeid,虽然触发不了节点click事件,但是设置了节点的enabledpostback后,点击节点还是可以触发postback事件的,把逻辑写在Page_Load的postback事件里面,并且通过事件名称判断 "Command$节点NODEID$$", 就可以了

注意,这种通过postback来写后台逻辑的方法,很实用,特别是在页面之间传值啊,父子窗体联动刷新关闭啊等等。

 


 

4.extaspnet中动态控件的写法

答:写法和asp.net传统没啥区别,但有一些基于AJAX要注意的地方,那就是创建控件的时机,请看代码

 

前台:一个空的form

  1. <ext:Form ID="Form2" runat="server" BodyPadding="5px" EnableBackgroundColor="true"  
  2.     Title="Form" OnInit="Form2_Init" >  
  3.     <Rows>  
  4.     </Rows>  
  5. </ext:Form>   

 

后台:

  1. protected void Form2_Init(object sender, EventArgs e)  
  2.  {  
  3.      SqlConnection myConnect = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString());  
  4.      SqlDataAdapter custDA = new SqlDataAdapter("select * from [user]", myConnect);  
  5.      myConnect.Open();  
  6.      DataSet custDS = new DataSet();  
  7.      custDA.Fill(custDS, "cc");  
  8.      ExtAspNet.DropDownList c1 = new ExtAspNet.DropDownList();  
  9.      c1.ShowLabel = false;  
  10.      c1.DataTextField="username";  
  11.      c1.DataValueField = "userid";  
  12.      c1.DataSource = custDS;  
  13.      c1.DataBind();  
  14.      ExtAspNet.FormRow fr = new ExtAspNet.FormRow();  
  15.      fr.Items.Add(c1);  
  16.      ExtAspNet.Label l = new ExtAspNet.Label();  
  17.      l.Label = "";  
  18.      l.Text = "";  
  19.      fr.Items.Add(l);  
  20.      fr.ColumnWidths = "10% 90%";  
  21.      Form2.Rows.Add(fr)  

这段代码是在form2中创建一行,并在里面创建一个下拉框,下拉框内容取自数据库一个表[user]

取值:

  1. protected void Button1_Click(object sender, EventArgs e)  
  2. {  
  3.     foreach (ExtAspNet.FormRow fr in Form2.Rows)  
  4.     {  
  5.         foreach (object c in fr.Controls)  
  6.         {  
  7.             if (c.GetType().ToString() == "ExtAspNet.DropDownList")  
  8.             {  
  9.                 ExtAspNet.DropDownList c1 = (ExtAspNet.DropDownList)c;  
  10.                 ExtAspNet.Alert.Show(c1.SelectedValue);  
  11.             }  
  12.         }  
  13.     }  
  14. }  

 

代码是传统写法,但注意触发的事件,extaspnet的动态控件,只可以写在page或者容器控件的Init事件中

问题来了,一般设计中,要用到动态控件,一般都是由用户选择了某个项目,然后动态创建对应的控件或者页面

比如想做一个万能查询功能,点击增加按钮,新增一行查询条件...,要想在extaspnet中实现,怎么做?

我想可以通过iframe(window)的方式来实现。有时间我再写个例子。

 


 

5 .extaspnet中上传控件的写法

 

作者没有编写上传控件,但有承诺会给一套FLASH的上传方案,嵌入在里面,实现大文件的上传,这个网上有源码

这里要提醒的是,就算你在ContentPanel控件里面加上<asp:FileUpload />,你也无法实现上传,因为extjs的局部刷新机制,你根本取不到上传的文件名,我的建议是,你想用上传,这个页面就不要用到extaspnet(或者PageManager 的 EnableAjax = "false" )。

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多