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
{
}
}
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;
}
}
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中,回发时能够正确恢复属性值