0

做一个最简单的Web控件

by 刘武 4. 十一月 2009 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方法。

 

Tags:

技术生涯

0

Javascript操作下拉框的常用方法

by 刘武 3. 十一月 2009 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:

技术生涯

3

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

by 刘武 22. 十月 2009 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: ,

技术生涯

0

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

by 刘武 15. 十月 2009 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:

技术生涯

0

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

by 刘武 28. 九月 2009 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: ,

技术生涯

Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft