由于wap浏览器和手机型号以及当前无线信息传输速度等问题,wap自动刷新功能的实现方法远没有Web方式多和简单,现今Web页面实现自动刷新功能可以用Ajax技术,web service 或者在Web页面中直接加上
<meta http-equiv=refresh content="" url=">
wap想要实现自动刷新功能,一般在WAP的一个card页面中加上
<onevent type="ontimer">
<go herf="url">
才能达到自动刷新的功能,
而使用dortnet开发wap应用程序的时候,往设计页面中拖曳一个form 就会在生成的wap页面中添加一个card,如果我们想要card有自动刷新的功能,那么dortnet的wap应用程序的form 在客户端要生成
<onevent type="ontimer">
<go herf="url">
这两行代码.所以我们需要自定义一个继承form控件的timerform 控件.
using System;
using System.Collections;
using System.Web.UI.MobileControls;
using System.Web.UI.MobileControls.Adapters;
namespace Acme
{
// ====================================================================
//
// TimerForm 控件类
//TimerForm 控件类继承form ,并且添加两个属性,一个是页面跳转的URL,
//一个是自动跳转的时间间隔Delay
// ====================================================================
public class TimerFormCS : Form
{
protected static readonly Object EventTimer = new Object();
// ================================================================
//时间间隔Delay的属性,默认为10秒钟,
// ================================================================
public int Delay
{
get
{
Object o = ViewState["Delay"];
return o != null ? (int)o : 10;
}
set
{
ViewState["Delay"] = value;
}
}
// ================================================================
//页面自动跳转的URL的属性
// ================================================================
public String AutoNavigateUrl
{
get
{
String s = (String)ViewState["AutoNavigateUrl"];
return s != null ? s : String.Empty;
}
set
{
ViewState["AutoNavigateUrl"] = value;
}
}
// ================================================================
//Timer 事件,如果自动跳转的时间到了,则跳转返回到服务器端,如果URL设置为空则返回当前页面
// ================================================================
public event EventHandler Timer
{
add
{
Events.AddHandler(EventTimer, value);
}
remove
{
Events.RemoveHandler(EventTimer, value);
}
}
// ================================================================
// OnTimer 方法
// ================================================================
protected virtual void OnTimer(EventArgs e)
{
EventHandler onTimer = (EventHandler)Events[EventTimer];
if (onTimer != null)
{
onTimer(this, e);
}
}
// ================================================================
// RaiseTimer 方法,激活一个timer事件 //
// ================================================================
public void RaiseTimer()
{
OnTimer(new EventArgs());
}
}
// ====================================================================
// WmlTimerFormAdapter 类 继承System.Web.UI.MobileControls.Adapters.WmlFormAdapter的Adapter,改写form控件的输出方式,在浏览器类型是wml的设备中输出<onevent type="timer">
// ====================================================================
public class WmlTimerFormAdapterCS : WmlFormAdapter
{
private const String TimerEventArgument = "$timer";
protected new TimerFormCS Control
{
get
{
return (TimerFormCS)base.Control;
}
}
protected override void RenderExtraCardElements(WmlMobileTextWriter writer)
{
String autoNavigateUrl = Control.AutoNavigateUrl;
bool renderAsPostBack = autoNavigateUrl.Length == 0 ||
DeterminePostBack(autoNavigateUrl) != null;
writer.WriteBeginTag("onevent");
writer.WriteAttribute("type", "ontimer");
writer.Write(">");
if (renderAsPostBack)
{
writer.RenderGoAction(Control.UniqueID,
TimerEventArgument,
WmlPostFieldType.Normal,
false);
}
else
{
// URL
autoNavigateUrl = Control.ResolveUrl(autoNavigateUrl);
writer.WriteBeginTag("go");
writer.Write(" href=\"");
writer.WriteEncodedUrl(autoNavigateUrl);
writer.Write("\">");
}
writer.WriteEndTag("onevent");
writer.WriteLine();
writer.WriteBeginTag("timer");
// WML timer lengths.
writer.WriteAttribute("value", (Control.Delay*10).ToString());
writer.WriteLine("/>");
}
// ================================================================
// HandlePostBackEvent 事件 //读出适配属性
// ================================================================
public override bool HandlePostBackEvent(String eventArgument)
{
if (eventArgument == TimerEventArgument)
{
String autoNavigateUrl = Control.AutoNavigateUrl;
if (autoNavigateUrl.Length > 0)
{
if (autoNavigateUrl.Length > 1 && autoNavigateUrl[0] == '#')
{
Page.ActiveForm = Control.ResolveFormReference(autoNavigateUrl.Substring(1));
}
}
else
{
Control.RaiseTimer();
}
return true;
}
else
{
return base.HandlePostBackEvent(eventArgument);
}
}
}
// ====================================================================
// HtmlTimerFormHelper 类 //
// HtmlTimerFormHelper 类继承 HtmlTimerFormAdapter 和 ChtmlTimerFormAdapter的adapter
// 在浏览器类型是HTML ,输出 <meta http-equiv="refresh">
// ====================================================================
class HtmlTimerFormHelperCS
{
private const String TimerEventArgument = "$timer";
public static void RenderTimerMetaTag(TimerFormCS form, HtmlMobileTextWriter writer)
{
String autoNavigateUrl = form.AutoNavigateUrl;
bool renderAsPostBack = autoNavigateUrl.Length == 0 ||
autoNavigateUrl[0] == '#';
writer.WriteBeginTag("meta");
writer.WriteAttribute("http-equiv", "refresh");
writer.Write(" content=\"");
writer.Write(form.Delay.ToString());
writer.Write(";url=");
if (renderAsPostBack)
{
HtmlPageAdapter pageAdapter = (HtmlPageAdapter)form.MobilePage.Adapter;
pageAdapter.RenderUrlPostBackEvent(writer, form.UniqueID, TimerEventArgument);
}
else
{
writer.WriteEncodedUrl(autoNavigateUrl);
}
writer.WriteLine("\">");
}
public static bool HandlePostBackEvent(TimerFormCS form, String eventArgument)
{
if (eventArgument == TimerEventArgument)
{
String autoNavigateUrl = form.AutoNavigateUrl;
if (autoNavigateUrl.Length > 0)
{
if (autoNavigateUrl.Length > 1 && autoNavigateUrl[0] == '#')
{
form.MobilePage.ActiveForm = form.ResolveFormReference(autoNavigateUrl.Substring(1));
}
}
else
{
form.RaiseTimer();
}
return true;
}
else
{
return false;
}
}
}
public class HtmlTimerFormAdapterCS : HtmlFormAdapter
{
protected new TimerFormCS Control
{
get
{
return (TimerFormCS)base.Control;
}
}
protected override bool RenderExtraHeadElements(HtmlMobileTextWriter writer)
{
base.RenderExtraHeadElements(writer);
if (writer != null)
{
HtmlTimerFormHelperCS.RenderTimerMetaTag(Control, writer);
}
return true;
}
public override bool HandlePostBackEvent(String eventArgument)
{
if (HtmlTimerFormHelperCS.HandlePostBackEvent(Control, eventArgument))
{
return true;
}
else
{
// 返回父类事件
return base.HandlePostBackEvent(eventArgument);
}
}
}
// ChtmlTimerFormAdapter 类
public class ChtmlTimerFormAdapterCS : ChtmlFormAdapter
{
protected new TimerFormCS Control
{
get
{
return (TimerFormCS)base.Control;
}
}
protected override bool RenderExtraHeadElements(HtmlMobileTextWriter writer)
{
base.RenderExtraHeadElements(writer);
if (writer != null)
{
HtmlTimerFormHelperCS.RenderTimerMetaTag(Control, writer);
}
return true;
}
public override bool HandlePostBackEvent(String eventArgument)
{
if (HtmlTimerFormHelperCS.HandlePostBackEvent(Control, eventArgument))
{
return true;
}
else
{
//
return base.HandlePostBackEvent(eventArgument);
}
}
}
}
接下来,我们需要把以上的代码编译成一个TimerForm.dll,然后在你的Wap项目工具箱中,添加对TimerForm.dll的自定义控件。
所有工作做好以后,就是修改web.config,添加如下配置
<system.web>
<mobileControls allowCustomAttributes="true" cookielessDataDictionaryType="System.Web.Mobile.CookielessData" >
<device name="HtmlDeviceAdapters2" inheritsFrom="HtmlDeviceAdapters">
<control name="Acme.TimerFormCS,timerform"
adapter="Acme.HtmlTimerFormAdapterCS,timerform" />
</device>
<device name="ChtmlDeviceAdapters2" inheritsFrom="ChtmlDeviceAdapters">
<control name="Acme.TimerFormCS, timerform"
adapter="Acme.ChtmlTimerFormAdapterCS,timerform" />
</device>
<device name="UpWmlDeviceAdapters2" inheritsFrom="UpWmlDeviceAdapters">
<control name="Acme.TimerFormCS,timerform"
adapter="Acme.WmlTimerFormAdapterCS,timerform" />
</device>
<device name="WmlDeviceAdapters2" inheritsFrom="WmlDeviceAdapters">
<control name="Acme.TimerFormCS, timerform"
adapter="Acme.WmlTimerFormAdapterCS,timerform" />
</device>
</mobileControls>
<system.web>
所有工作做好以后,我们从工具箱中拖曳一个刚刚添加的TimerForm控件 ,然后设置属性Delay 与AutoNavigateUrl ,这样一个具有刷新功能的wap页面就完成了.
源代码请参考:
http://www.dotnetjunkies.com/Mob ... =doc/TimerForm.aspx