打印

ASP.NET页面刷新问题

请问有谁知道如何指定一个页面定时刷新,该怎么写,谢谢!
由于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