其实这篇文章本不想写的,但是考虑到这件事也折腾了我大半天的,唉...记下来也给自己一个总结吧.
在用VS.NET做移动WEB开发时,很明显有一个控件是非常有用但是VS.NET却没有提供的,那就是TextArea,多行输入.
大家可以直接去看我上面提供的两个链接,也可以接着往下看,我会先简要地介绍一下代码开发,然后重点是总结在配置方面的问题.而这一点,上面老外的文章中却言之甚少.
开发一个自定义控件,要自己实现两个类,一是派生于某个控件的你想要的控件类,二是负责将这个控件Render出来的适配器类(Adapter).
首先,我们实现一个叫MultiLineTextBox类,派生于TextBox类,比较简单,就是多了两个属性Cols和Rows.代码如下:
public class MultiLineTextBox : System.Web.UI.MobileControls.TextBox
{
private int _cols=0;
public int Cols
{
get{ return this._cols; }
set{ this._cols=value; }
}
private int _rows=0;
public int Rows
{
get{ return this._rows; }
set{ this._rows=value; }
}
}
{
private int _cols=0;
public int Cols
{
get{ return this._cols; }
set{ this._cols=value; }
}
private int _rows=0;
public int Rows
{
get{ return this._rows; }
set{ this._rows=value; }
}
}
当然你也可以象老外文章那样,直接把两个属性值放在ViewState中,如果你不打算在你的程序中禁用ViewState的话,这应该是一个更好的办法.
第二步,实现一个派生于ControlAdapter的MultiLineTextBoxAdapter类,重载一个属性和一个方法即可.代码如下:
public class HTMLMultiLineTextBoxAdapter : System.Web.UI.MobileControls.Adapters.ControlAdapter
{
protected new MultiLineTextBox Control
{
get { return (MultiLineTextBox)base.Control; }
}
public override void Render(HtmlTextWriter writer)
{
writer.WriteBeginTag("textarea");
String renderName;
if(Device.RequiresAttributeColonSubstitution)
{
renderName = Control.UniqueID.Replace(':', ',');
}
else
{
renderName = Control.UniqueID;
}
writer.WriteAttribute("name", renderName);
writer.WriteAttribute("cols",Control.Cols.ToString());
writer.WriteAttribute("rows",Control.Rows.ToString());
writer.Write(">");
writer.Write(Control.Text);
writer.WriteEndTag("textarea");
}
}
{
protected new MultiLineTextBox Control
{
get { return (MultiLineTextBox)base.Control; }
}
public override void Render(HtmlTextWriter writer)
{
writer.WriteBeginTag("textarea");
String renderName;
if(Device.RequiresAttributeColonSubstitution)
{
renderName = Control.UniqueID.Replace(':', ',');
}
else
{
renderName = Control.UniqueID;
}
writer.WriteAttribute("name", renderName);
writer.WriteAttribute("cols",Control.Cols.ToString());
writer.WriteAttribute("rows",Control.Rows.ToString());
writer.Write(">");
writer.Write(Control.Text);
writer.WriteEndTag("textarea");
}
}
属性Control的重载说明我要管理的类叫MultiLineTextBox.而重载的Render方法则具体了如何在页面中去表现这个控件,就是输出一个textarea标签.
第三步,修改web.config,增加对设备的支持,我就是在这一步被卡住了...先提交吧,下一篇再讨论.