• Asp.net 控件开发(四) 数据回传


    准备技术:

    1.       Asp.net常规开发技术;

        2.了解控件开发的呈现、属性状态简单原理。

    内容:

         数据回传就是说客户端将数据回交给服务器,然后asp.net模型将会将处理后的数据回传到表单中去。如果开发的控件需要回传的话,就必须要去继承于IPostBackDataHandler接口。 继承IPostBackDataHandler之后我们一般需要去重写两个方法:

         1.LoadPostData().方法返回一个bool值,表示该控件的值是否发生改变(需要我们去判断);

         2.RaisPostDataChangeEvent().此方法是在LoadPostData方法返回true的时候去执行的。

     

         一、LoadPostData方法

         此方法的原型:LoadPostData(string postDataKey,System.Collections.Specialized.NameValueCollection postCollection)

         参数postDataKey就是回传控件的UniqueID,在客户端表现为name属性。postCollection就是回传的数据值的结合。所以我们可以通过postCollection[postDataKey]来获取本控制回传的值,所以我们就可以来比较原来控件的值跟回传的值,从而来确定LoadPostData方法返回true还是false。

         要注意的一点是,我们回传时需要name属性,所以如果我们定义的控件要支持数据回传的话,就必须要去添加属性name。

         

         二、RaisePostDataChangeEvent()方法

         RaisePostDataChangeEvent方法一般是在LoadPostData返回True的是否才去执行。一般我们在此方法中去触发一些事件,如:TextChanged。

         

         三、实例

         下面就来模仿写一个TextBox控件,当然现在只是去实现数据回传功能。

             首先我们实现控件的一些属性,现在我们就让其有Text属性:

              

     [PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty),
            DefaultValue(
    ""
    ),
            Category(
    "Behavior"
    ),
            Description(
    "文本内容"
    )]
            
    public string
     Text
            
    {
                
    get

                
    {
                    
    return this.ViewState["Text"== null ? String.Empty : (string)this.ViewState["Text"
    ];
                }

                
    set
                
    {
                    
    this.ViewState["Text"=
     value;
                }

            }

         然后我们把控件呈现,控件是继承于WebControl的。

     

      protected override HtmlTextWriterTag TagKey
            
    {
                
    get

                
    {
                    
    return
     HtmlTextWriterTag.Input;
                }

            }


            
    protected override void AddAttributesToRender(HtmlTextWriter writer)
            
    {
                
    base
    .AddAttributesToRender(writer);

                
    if (Page != null
    )
                
    {
                    Page.VerifyRenderingInServerForm(
    this
    );
                }


                writer.AddAttribute(HtmlTextWriterAttribute.Type, 
    "text");
                writer.AddAttribute(HtmlTextWriterAttribute.Name, 
    this
    .UniqueID);
                
    if (!
    Enabled)
                
    {
                    writer.AddAttribute(HtmlTextWriterAttribute.Disabled, 
    "disabled"
    );
                }

                writer.AddAttribute(HtmlTextWriterAttribute.Value, 
    this.Text);
            }



            
    protected override void AddParsedSubObject(object obj)
            
    {
                
    if (!(obj is
     Literal))
                    
    return
    ;
                
    base
    .AddParsedSubObject(obj);
            }

         这里要注意的是一定要注册其前台"name"属性。最后我们看如何让控件支持数据回传:

     

       public bool LoadPostData(string postKey, System.Collections.Specialized.NameValueCollection valueCollection)
            
    {
                
    string postData =
     valueCollection[postKey].ToString();
                
    string strText = this
    .Text;
                
    if
     (strText.Equals(postData, StringComparison.Ordinal))
                    
    return false
    ;
                
    this.Text =
     postData;
                
    return true
    ;
            }


            
    public void RaisePostDataChangedEvent()
            
    {
                EventHandler handler 
    =
     (EventHandler)Events[_objEvent];
                
    if (handler != null
    )
                
    {
                    handler(
    this
    , EventArgs.Empty);
                }

            }

     

    其实原理很简单,就是判断回传过来的数据是否跟原来相等,不相等返回true,则执行RaisePostDataChangeEvent方法。控件的全部代码如下:

     

    using System;
    using
     System.Collections.Generic;
    using
     System.ComponentModel;
    using
     System.Text;
    using
     System.Web;
    using
     System.Web.UI;
    using
     System.Web.UI.WebControls;

    namespace
     HenllyeeControls
    {
        [DefaultProperty(
    "Text"
    ),
        ParseChildren(
    true,"Text"
    ),
        DefaultEvent(
    "TextChanged"
    ),
        ControlBuilder(
    typeof
    (HenllyeeTextBuider))]
        
    public class
     HenllyeeText:WebControl,IPostBackDataHandler
        
    {
            
    Properties


            
    Events

            
    Render

            
    IPostBackData
        }


        
    public class HenllyeeTextBuider : ControlBuilder
        
    {
            
    public override bool
     AllowWhitespaceLiterals()
            
    {
                
    return false
    ;
            }

            
    public override bool HtmlDecodeLiterals()
            
    {
                
    return true
    ;
            }

        }

    }

     

    我们新建一个页面中,添加刚才的控件,跟一个Button可是发现能支持数据回传了。

    [代码下载]里面有控件源代码及使用的Demo

         

    作者:Henllyee Cui
    出处: http://henllyee.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
  • 相关阅读:
    (基于Java)编写编译器和解释器第5章:解析表达式和赋值语句第一部分(连载)
    (基于Java)编写编译器和解释器第6章:解释执行表达式和赋值语句(连载)
    (基于Java)编写编译器和解释器第9章:解析声明第一部分(连载)
    (基于Java)编写编译器和解释器第5章:解析表达式和赋值语句第二部分(连载)
    (基于Java)编写编译器和解释器第4章:符号表(连载)
    (基于Java)编写编译器和解释器第8A章:基于Antlr解析&解释执行Pascal控制语句(连载)
    (基于Java)编写编译器和解释器第7章:解析(Parsing)控制语句第一部分(连载)
    (基于Java)编写编译器和解释器第5A章:基于Antlr解析表达式和赋值语句及计算(连载)
    (基于Java)编写编译器和解释器第7章:解析(Parsing)控制语句第二部分(连载)
    (基于Java)编写编译器和解释器第8章:解释Pascal控制语句(连载)
  • 原文地址:https://www.cnblogs.com/Henllyee/p/1251502.html
Copyright © 2020-2023  润新知