十二月 6 2009

忙一段時間先

Category: 你我他 ? 刘武 @ 12:50

稍待段日子再更新

Tags:

十一月 9 2009

做一个最简单的Web控件2-AddAttributesToRender

Category: asp.net控件开发 ? 刘武 @ 20:42

回顾上一篇的例子,如果我们直接在页面中添加该控件:<cc1:myhyperlink id="MyHyperLink1" runat="server"></cc1:myhyperlink>,那么浏览该页面的时候你会看到如下的HTML代码:<span id="MyHyperLink1"><a href="http://www.liuwu.net" target="_blank">Welcome To Liuwu.Net</a></span>,比我们预想的多了一个span标签,其实由于我们继承了WebControl类,该类会默认生成<span></span>容器。如果不需要该标签,我们可以重载TagKey属性和AddAttributesToRender方法: 

protected override HtmlTextWriterTag TagKey
{
    get
    {
        return HtmlTextWriterTag.A;
    }
}

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    writer.AddAttribute(HtmlTextWriterAttribute.Href, "http://www.liuwu.net");
    writer.AddAttribute(HtmlTextWriterAttribute.Target, "_blank");
    base.AddAttributesToRender(writer);
}

protected override void RenderContents(HtmlTextWriter output)
{
    output.Write("Welcome To Liuwu.Net");
}

TagKey属性指明了该控件最外层的标签,AddAttributesToRender方法则为该标签添加必要的属性,RenderContents方法在上一篇已经有介绍。重新浏览该页面,Span标签已经没有了。

参考:庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

Tags:

十一月 4 2009

做一个最简单的Web控件

Category: asp.net控件开发 ? 刘武 @ 20:28

上一篇了解了asp.net服务器控件的生命周期,本篇来做一个最简单的实例。

首先建立新项目Liuwu.Net.WebControls,用来存放我所有的自定义控件。

然后在项目上右击,并选择添加>新建项,这里我们选择Web自定义控件,并为该控件命名为MyHyperLink,该控件将是一个类似这样的超链接:Welcome To Liuwu.Net

 Visual Studio 将为我们生成以下的模板:

namespace Liuwu.Net.WebControls
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:MyHyperLink runat=server></{0}:MyHyperLink>")]
    public class MyHyperLink : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }
            set
            {
                ViewState["Text"] = value;
            }
        } 

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

很多东西现在还不懂,不过没关系,现在我们只要明白控件开发的最终目的也就是将HTML代码输出到客户端,而RenderContents方法就是完成这个任务的。看看上面那个超链接,她的HTML代码是不是应该是 <a href="http://www.liuwu.net" target="_blank">Welcome To Liuwu.Net</a>呢,那我们只要在RenderContents方法中输入该代码就可以了。

以下是一种实现方式

[DefaultProperty("Text")]
[ToolboxData("<{0}:MyHyperLink runat=server></{0}:MyHyperLink>")]
public class MyHyperLink : WebControl

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write("<a href=\"http://www.liuwu.net\""+
            "target=\"_blank\">Welcome To Liuwu.Net</a>");
    }
}

这里用了HtmlTextWriter的Write方法直接输出HTML代码(为了显示方便,这里将字符串拆开了)。

编译该项目,并添加网站,在工具栏中就能看到刚才编写的控件了,直接拖到页面上就可以使用,具体过程就不在累赘了。

除了该方法,我们还可以利用服务器控件的RenderControl方法输出控件

HtmlGenericControl a = new HtmlGenericControl("a");
a.Attributes.Add("href", "http://www.liuwu.net");
a.Attributes.Add("target", "_blank");
a.InnerText = "Welcome To Liuwu.Net";
a.RenderControl(output);

注意这里要引入System.Web.UI.HtmlControls命名空间,和第一种方法比起来,该方法显然没那么容易出错,不过也不是十全十美。

下面再介绍第三种方法

output.AddAttribute(HtmlTextWriterAttribute.Href,"http://www.liuwu.net");
output.AddAttribute(HtmlTextWriterAttribute.Target, "_blank");
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write("Welcome To Liuwu.Net");
output.RenderEndTag();

这里分别使用了HtmlTextWriterAttribute和HtmlTextWriterTag枚举,进一步避免了出错的可能。不过要注意,如果要为标签添加属性,则必须在RenderBeginTag方法之前调用AddAttribute方法。

 

参考:庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

Tags:

十一月 3 2009

Javascript操作下拉框的常用方法

Category: Javascript ? 刘武 @ 22:43

项目中碰到需要用javascript操作下拉框的情况,顺便做一下总结,列出一些常用方法,以下方法均在FIRFOX3.5及IE8上测试过,如有其他浏览器无法正常运行的请与笔者联系。

/*添加一个下拉框*/
function AddDropDownList(id,fatherCtl)
{
    if(!document.getElementById(id))
    {
        var ddl = document.createElement('select');
        ddl.setAttribute("id",id);  
        if(fatherCtl&&document.getElementById(fatherCtl))
            document.getElementById(fatherCtl).appendChild(ddl);
        else
            document.body.appendChild(ddl);
     }
}

/*删除指定的下拉框*/
function RemoveDropDownList(id)
{
      var ctl = document.getElementById(id);
      if(ctl)
        ctl.parentNode.removeChild(ctl);
}

/*给下拉框添加选项*/
function AddDDDLOption(id,text,value)
{
    var ctl = document.getElementById(id);
    if(ctl)
    {
        ctl.options[ctl.options.length]   =   new   Option(text,value); 
    }
}

/*删除所有选项*/
function RemoveAllDDLOptions(id)
{
    var ctl = document.getElementById(id);
    if(ctl)
    {
        ctl.options.length=0;
    }
}

/*删除指定索引的选项*/
function RemoveDDLOption(id,index)
{
    var ctl=document.getElementById(id);
    if(ctl && ctl.options[index])
    {
        ctl.options[index]=null;
    }
}

/*获取下拉框选择的值*/
function GetDDLSelectedValue(id)
{
    var ctl = document.getElementById(id);
    if(ctl)
    {
        return ctl.options[ctl.selectedIndex].value;
    }
}

/*获取下拉框选择的文本*/
function GetDDLSelectedText(id)
{
    var ctl = document.getElementById(id);
    if(ctl)
    {
        return ctl.options[ctl.selectedIndex].text;
    }
}

Tags:

十月 22 2009

如何在ASP.NET页面中嵌入WINFORM控件四

Category: asp.net ? 刘武 @ 20:56

前一篇我们知道了通过调整.NET程序集的区域安全性可以控制winform控件对本地资源的使用权限,本片将介绍另外一种方法,即通过设置URL来设定winform控件的权限。

还是上一篇的例子

打开“管理工具”/ “Microsoft .NET Framework 2.0 配置”

二 展开“运行库安全策略”

 

三 右击All_Code,并选择“新建”,输入代码组名称

 

四 点击下一步,在代码组类型里选择URL,并输入URL的值

五 权限集选择FullTrust,也可以选择创建新权限集

六 单击下一步完成操作

将上一篇写好的空间发布到刚才的URL就可以访问了,而且这样只对特定的URL信任,其他的不会受到影响,也不会担心有安全问题。

笔者测试在IE6下面没有问题,但IE7以上则必须将刚才的URL添加到信任网站才能正常访问(两者均为默认的安全设置)。

部分电脑可能没有该配置程序,则只能通过命令行来设置,具体操作可以查看caspol命令及其帮助,该文件位于\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录下。

前篇:

如何在ASP.NET页面中嵌入WINFORM控件三

如何在ASP.NET页面中嵌入WINFORM控件二

如何在ASP.NET页面中嵌入WINFORM控件一

Tags: ,

十月 15 2009

ASP.NET 服务器控件生命周期

Category: asp.net | asp.net控件开发 ? 刘武 @ 21:53

庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术   第一章讲了一些服务器控件的基本知识,

其中asp.net服务器控件的生命周期,是开发控件的第一步,也是核心。

服务器控件生命周期包括以下11个阶段:

  1. 初始化(OnInit):完成控件的初始化及打开控件的视图状态跟踪功能。
  2. 加载视图状态(LoadViewState):本阶段只在页面回发时才执行,完成加载视图状态到控件的任务。
  3. 加载回传数据(LoadPostData):本阶段只在页面回发时执行,用于装在客户端提交的数据
  4. 装载(OnLoad):页面装载时先执行页面的Page_Load事件,再执行各个子控件的OnLoad方法。
  5. 数据回传事件通知(RaisePostDataChangedEvent):本阶段只在页面回发时执行。当LoadPostData方法返回值为true时,该方法才会被调用。
  6. 触发回发事件(RaisePostBackEvent):本阶段仅在页面回发时执行,主要处理引起回发的客户端事件。
  7. 预呈现(OnPreRender):本阶段主要完成控件呈现之前所需要的一些工作,一般对控件进行资源注册,如注册javascript脚本和隐藏域控件等。
  8. 保存视图状态(SaveViewState):把页面控件视图信息进行存储。
  9. 呈现(Render):主要将控件标记和字符文本输出到服务器控件输出流中,可以直接些HTML标记,也可以调用每个控件都与的RenderControl方法。
  10. 卸载(OnUnload):对控件进行资源清除工作。
  11. 释放(Dispose):释放使用的资源,如数据库连接,IO文件流等.

这里只是讲了一些基本的概念,也许很多人会觉得是雾里看花,其实没关系,就当是一个引子吧,相信接触到实际的控件开发之后会对各个事件有比较深刻的理解。

Tags:

十月 14 2009

庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

Category: Reading ? 刘武 @ 20:54

 

庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

作者:郑健
出版社:电子工业出版社 
购买:卓越网   当当网


网上对该书的评价一直很高,恰好最近想研究一下控件开发技术,于是就在卓越网购买了一本,初步看了一下目录,感觉内容还是挺多的,从基础到深入的知识都有,现在就准备慢慢啃吧。

相关文章:

  1. ASP.NET 服务器控件生命周期
  2. 做一个最简单的Web控件
  3. 做一个最简单的Web控件2-AddAttributesToRender

Tags:

九月 28 2009

如何在ASP.NET页面中嵌入WINFORM控件三

Category: asp.net ? 刘武 @ 20:38

前两篇文章讲述了如何在ASP.NET页面中嵌入WINFORM控件,并且通过第二篇我们了解到有些情况下,只有本地网络或将访问的网站添加到信任站点才可以正确的访问该控件。其实有时候会更复杂,我们还需要调整.NET程序集的权限,本篇就是一个具体的例子。该例子会通过WINFORM控件在本地磁盘中写入文件。

一 打开前两篇创建的项目,并添加WINFORM用户控件IoTest,代码如下:

namespace Liuw.Net.WindowsControlLibrary
{
    public partial class IoTest : UserControl
    {
        public IoTest()
        {
            InitializeComponent();
        }

        public void Write(string path)
        {
            File.WriteAllText(path, "welcome to www.liuwu.net ");
        }
    }
}

功能很简单,仅提供一个公共的Write方法,向指定的文件写入信息。

二 编译该项目,并将Liuw.Net.WindowsControlLibrary.dll拷贝到WebSite所在目录

三 添加IoTest.aspx页面,并添加以下代码


<script type="text/javascript">
    function Write()
    {
        var obj = document.getElementById('ctl');
        obj.Write("D:/Test.txt");
    }
</script>
<input type="button" value="Write" onclick="Write()" />
<object id="ctl"  classid="Liuw.Net.WindowsControlLibrary.dll#Liuw.Net.WindowsControlLibrary.IoTest"></object>
可以看出我们是在D盘写入Test.txt文件。

 四 访问该页面,我们会得到脚本错误

请求“System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限已失败。

其实不用紧张,这说明该网站没有执行指定程序集的权限,那该如何做呢,下面就来配置相关权限。

五 打开“管理工具”/ “Microsoft .NET Framework 2.0 配置”

六 展开“运行库安全策略”,并点击右边的“调整区域安全性” 

七 选择下一步,并将 "本地Intranet "设为完全信任

 

因笔者测试的地址用的是localhost,如果你已将网站添加的信任网站,则调整信任网站为完全信任。

八 重新启动IE,就可以了。

注意:该配置工具只有装了SDK以后才会有,所以为了有更强的操作性,我们必须寻找其他设置权限的途径,以后的章节会针对该问题进行讨论。

前篇:

如何在ASP.NET页面中嵌入WINFORM控件一

如何在ASP.NET页面中嵌入WINFORM控件二

Tags: ,

九月 23 2009

如何在ASP.NET页面中嵌入WINFORM控件二

Category: asp.net ? 刘武 @ 20:46

上一篇介绍了在ASP.NET页面中嵌入WINFORM控件的基本方法,本篇会举个稍微复杂的例子来说明如何在页面中调用WINFORM控件的属性和方法。

一 新建项目 Liuw.Net.WindowsControlLibrary,并添加WINDOWS用户控件 MyControl1

二 给控件 MyControl1 添加属性和方法:

namespace Liuw.Net.WindowsControlLibrary
{
    public partial class MyControl1 : UserControl
    {
        public MyControl1()
        {
            InitializeComponent();
        }

        private string _userName = "";
        public string UserName
        {
            set { _userName = value; }
            get { return _userName; }
        }

        public void SayHello()
        {
            MessageBox.Show("Welcome To Liuwu.net," + _userName);
        }
    }
}

该控件包含一个UserName属性及SayHello方法,当调用方法的时候,则弹出对话框。

三 编译项目,并拷贝dll文件到网站目录

四 添加页面SayHello.aspx


<script type="text/javascript">
function SayHello()
{
    var obj = document.getElementById("ctl");
    var input = document.getElementById("inputName");
    obj.UserName = input.value;
    obj.SayHello();      
}
</script>
Name:<input type="text" id="inputName" />
<input type="button" value="SayHello" onclick="SayHello()" />
<object id="ctl" 
 classid="Liuw.Net.WindowsControlLibrary.dll#
 Liuw.Net.WindowsControlLibrary.MyControl1"
></object>

不难看出,用JS脚本就可以完成属性和方法的调用,不过此时运行页面,可能会出现脚本错误,提示 “对象不支持该属性或方法”。那是因为我们在编译用户控件时少了一个步骤:

五 右击项目Liuw.Net.WindowsControlLibrary,并选择属性,选择“应用程序”选项卡,点击"程序集信息",勾中“使程序集COM可见”,

重新编译,并替换网站目录下的文件:

现在我们就可以正常访问了,但是还有个限制,只有本地网络或将访问的网站添加到信任站点才可以。是不是很麻烦,的确,他就是这麽麻烦,甚至笔者在VS2005环境下直接浏览也会提示脚本错误,必须建立虚拟目录,或者发布后才能使用。还有个方法就是配置.NET的程序集权限,这个会在以后的章节单独讨论。

前篇:

如何在ASP.NET页面中嵌入WINFORM控件一

后篇:

如何在ASP.NET页面中嵌入WINFORM控件三  

Tags: ,

九月 21 2009

如何在ASP.NET页面中嵌入WINFORM控件一

Category: asp.net ? 刘武 @ 20:45

在.NET之前,我们如果想访问客户端的资源,最常见的方式就是在网页里面嵌入ACTIVEX控件。现在有了.NET,我们可以将WINFORM控件嵌入在网页里面,从而直接控制客户端,不过前提是客户端必须安装了.NET库。这有点像JAVA 的APPLET(笔者对JAVA不是很熟,如有问题欢迎指正)。由于需要.NET的运行库,所以使用起来有很多限制,不过如果是企业内部系统,.NET库可以做为客户端部署的一部分,这样可以利用.NET编程的优势,大大简化开发过程。

本文就从最简单的例子入手,讲解具体的开发过程。

一 新建windows控件库项目,姑且取名为Liuw.Net.WindowsControlLibrary

二 添加windows控件HelloWorld

三 添加按钮及事件

        这里我们只添加一个按钮,点击按钮就弹出提示框 "Welcome To Liuwu.net "

      以下是部分代码

namespace Liuw.Net.WindowsControlLibrary
{
    public partial class HelloWorld : UserControl
    {
        public HelloWorld()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Welcome to Liuwu.Net");
        }
    }
}

四 编译该项目,得到Dll文件 Liuw.Net.WindowsControlLibrary.dll

五 新建网站,将刚才的Dll文件拷贝到根目录下,并添加页面 WinformCtlTest.aspx

六 在aspx页面添加以下代码

<object id="ctl" classid="Liuw.Net.WindowsControlLibrary.dll#

Liuw.Net.WindowsControlLibrary.HelloWorld"></object>

这里有点像ActiveX控件的调用,classid的命名规则是 "dll文件名#命名空间名.类名",中间并没有换行,我这里只是为了方便显示。

七 运行该页面,就会看到刚才编写的控件了,点击按钮,则弹出提示框 "Welcome To Liuwu.net "

怎么样,是不是觉得太简单了,别急,下一篇会举个稍微复杂的例子。

后篇:

如何在ASP.NET页面中嵌入WINFORM控件二

如何在ASP.NET页面中嵌入WINFORM控件三  

Tags: ,