技术开发 频道

ASP.NET自定义控件:简单的星级控件

  3. 实现

  (1)首先创建解决方案,包含ControlLibrary类库(定义了自定义控件类)和Web网站。

  (2)在类库中创建Image目录,并放置使用的星形图片stars.gif,为了能够在网站中引用程序集中的资源文件,需要将图片的Build Action(生成动作)属性设置为Embedded Resource(嵌入资源),并且在AssemblyInfo.cs中声明要使用的资源文件,如下所示:

[assembly: WebResource("ControlLibrary.Image.stars.gif","image/jpg")]

  使用了WebResource(实际上是WebResourceAttribute类,为了使用该类需要引入System.Web.UI命名空间)定义了使用的资源,该类的构造函数使用了两个参数,第一个参数是Web资源的名称,第二个参数是MIME类型。Web资源的名称必须遵循特定规则:命名空间名称+目录名称+文件名称,中间用半角点字符分隔。MIME类型对于不同的文件有不同的表示,详细的MIME列表可参考相关资料。

  资源的名称可以通过.NET Reflector之类的工具浏览。载入某个程序集后,如果嵌有资源文件,可以通过Resources目录浏览嵌入的资源

  (3)在类库中创建自定义控件类Star.cs,并引入必须的命名空间:

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ControlLibrary
{
    
public class Star : WebControl
    {
    }
}

  (4)接下来定义Score和Comment属性,将这两个属性存储在ViewState中,同时如果用户没有设计得分的情况下将得分设置为0,也就是将得分的默认值设置为0,这里使用到了DefaultValutAttribute类,该类用于设置属性的默认值。

[DefaultValue(0)]
public int Score
{
    
get
    {
        
object obj = ViewState["Score"];
        
return obj == null ? 0 : Convert.ToInt32(obj);
    }
    
set
    {                
        ViewState[
"Score"] = value;
    }
}

public string Comment
{
    
get
    {
        
object obj = ViewState["Comment"];
        
return obj == null ? string.Empty : Convert.ToString(obj);
    }
    
set
    {
        ViewState[
"Comment"] = value;
    }
}

  由于HTTP请求完成之后会断开连接,把属性保存到私有变量中不会满足我们的要求(提交回发时会重新生成自定义控件类,有可能丢失属性值),所以保存到ViewState中,回发时能够正确恢复属性值

0
相关文章