[Wap]自定义asp.net mobile control

[Wap]自定义asp.net mobile control


编写者


日期


关键词


郑昀@ultrapower


2005-7-28


Wap ASP.NET Mobile control device adapter

 

Device Adapter概念

按照MSDN《Walkthrough: Adding Support for Devices》的指示:

我们要想自定义MMIT(Microsoft Mobile Internet Toolkit)提供的控件,那么可以改变Adapter在最后关头的渲染工作。

 

首先,我们要说明render的概念,最好的动画教程就是http://www.asp.net/mobile/2514A_01A001.swf,它是Mobile Web Application Architecture的flash讲解。

所有的ASP.NET mobile device adapter都是通过text writer做render的。这些text writer均继承自MobileTextWriter。它提供了WriteWriteLine, 以及WriteBeginTag等方法。对于WML来说,这个Text Writer是System.Web.UI.MobileControls.Adapters.WmlMobileTextWriter。

 

第一步,下载http://go.microsoft.com/fwlink/?LinkId=6350的Device Adapter Code源代码;


或者直接链接MobileIT.exe


http://www.microsoft.com/downloads/details.aspx?FamilyId=AE597F21-B8E4-416E-A28F-B124F41F9768&displaylang=en

       第二步,编辑其中的WmlTextBoxAdapter.cs文件;

      第三步,通过csc.exe生成出一个新的Adapter DLL;

      第四步,配置web.config;

      第五步,重新编译你的工程。

 

      可惜呀,MobileIt.exe下载不了。当然在ASP.NET 2.0中,是很容易地自定义Adapter的。

那么现在ASP.NET 1.1中,我们只好折衷采用下面的办法:

自定义一个Adapter类

在这里我们来定义一个继承自

System.Web.UI.MobileControls.Adapters.WmlListAdapter

的Adapter,来准备改写mobile:list控件的输出方式。

将下面的代码保存为ListAdapter.cs:


ListAdapter.cs


using System;

using System.Collections;

using System.Web.UI.MobileControls.Adapters;

 

namespace iUltraMobiles

{

    /// <summary>

    /// ListAdapter 的摘要说明。

    /// 首先利用下面的命令编译出一个ListAdapter.dll:

    /// csc /t:library /r:System.Web.Mobile.dll ListAdapter.cs

    /// 其次,将以下的配置添加入web.config中mobileControls节点下:

    /// <device name="UltraListDeviceAdapters"

    /// inheritsFrom="WmlListAdapter">

    /// <control name="System.Web.UI.MobileControls.Form"

    /// adapter="iUltraMobiles.ListAdapter, iUltraMobiles" />

    /// </device> 

/// <see cref="http://www.cnblogs.com/zhengyun_ustc/archive/2005/07/28/customcuildyourmobilecontrol.html"/>
/// <seealso cref="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mwsdk/html/mwlrfdevice.asp"/>

    /// </summary>

    public class ListAdapter :System.Web.UI.MobileControls.Adapters.WmlListAdapter

    {

        public override void Render(

            System.Web.UI.MobileControls.Adapters.WmlMobileTextWriter writer)

        {

            // Add your attributes here.

            writer.WriteBeginTag("img");

            writer.WriteAttribute("src","Images/1.png");

            writer.WriteAttribute("alt", "欢迎您!");

            writer.WriteLine(" />");

 

            base.RenderChildren(writer);

 

        }

    }

}

 

编译ListAdapter

利用下面的命令编译出一个ListAdapter.dll:

csc /t:library /r:System.Web.Mobile.dll ListAdapter.cs

将这个ListAdapter.DLL复制到你的WAP应用程序bin目录下。

修改web.config来提供control mapping

在你的web.config文件中找到mobileControls节点,修改为以下:


Web.config中的system.web节点下


<!-- 指定没有 COOKIE 的数据字典类型

        这将使字典的内容出现在本地请求 URL 查询字符串中。

        这是在没有 Cookie 的设备上进行窗体身份验证所必需的。

    -->

    <!--在您使用像 useRandomID 这样的自定义属性时,必须在您的移动 Web 应用程序中启用自定义属性allowCustomAttributes。

    -->

    <mobileControls allowCustomAttributes="true"cookielessDataDictionaryType="System.Web.Mobile.CookielessData" >

        <device name="UltraListDeviceAdapters"

            inheritsFrom="WmlDeviceAdapters">

            <control name="System.Web.UI.MobileControls.List"

                adapter="iUltraMobiles.ListAdapter, iUltraMobiles" />

        </device>

    </mobileControls>

device节点就声明了一个新的Adapter,名为“UltraListDeviceAdapters”,这个名字是可以随便定义的。inheritsFrom属性是指。你必须提供控件的fully qualified control class name:“iUltraMobiles.ListAdapter, iUltraMobiles”,control的name属性指的是“你重载的哪一个mobile控件”。

试用新控件

现在你已经修改了mobile:list控件的最终渲染方式,在它原本输出的诸多个<a> tag之前抢先输出了你的image的符合wml规范的tag。

这样,你的aspx页面不需要做任何改动,重新编译你的工程后,新的渲染方式就生效了。

你可以在M3gate模拟器上试验。

 

附录A   mobileControls例子:

下面给一个比较完整的例子做示范:

<!-- Adapter configuration for mobile controls used in the portal -->

        <mobileControls>

            <device name="PortalHtmlDeviceAdapters" inheritsFrom="HtmlDeviceAdapters">

                <control name="ASPNetPortal.MobileControls.TabbedPanel, Portal" adapter="ASPNetPortal.MobileControls.HtmlTabbedPanelAdapter,Portal" />

                <control name="ASPNetPortal.MobileControls.LinkCommand, Portal" adapter="ASPNetPortal.MobileControls.HtmlLinkCommandAdapter,Portal" />

            </device>

            <device name="PortalChtmlDeviceAdapters" inheritsFrom="ChtmlDeviceAdapters">

                <control name="ASPNetPortal.MobileControls.TabbedPanel, Portal" adapter="ASPNetPortal.MobileControls.ChtmlTabbedPanelAdapter,Portal"/>

            </device>

            <device name="PortalWmlDeviceAdapters" inheritsFrom="WmlDeviceAdapters">

                <control name="ASPNetPortal.MobileControls.TabbedPanel, Portal" adapter="ASPNetPortal.MobileControls.WmlTabbedPanelAdapter,Portal" />

            </device>

        </mobileControls>

 

附录B   mobileControls属性定义表:



      mobileControls节点的具体各项属性定义可以参见:

      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mwsdk/html/mwlrfdevice.asp

     The <mobileControls> element has the attributes shown in the following table.


Attributes of the <device> subtag


Description


name


Specifies the unique name by which you must identify the device adapter set.


inheritsFrom


An optional reference to another device adapter set, from which this set must inherit. The specified device adapter set can either appear earlier in the same <mobileControls> section, or in the <mobileControls> section of a higher-level configuration file.


predicateClass


Specifies the class type that supplies the evaluator predicate. The name that you use for the class type must follow the .NET Framework standards for specifying a fully qualified type name.

ASP.NET searches the specified assembly for the type. If the adapter set inherits from another type, the predicateClass attribute is not necessary and will default to the parent set's value.


predicateMethod


Specifies the method that supplies the evaluator predicate. The method must be static, and of the following signature:

static bool EvaluatorMethod(HttpContext context)

If the adapter set inherits from another adapter set, the predicateMethodattribute is not necessary, and will default to the parent set's value.


pageAdapter


Specifies the class type of the page adapter for the adapter set. The specified class must implement the IPageAdapter interface. The name must follow the .NET standards for specifying a fully qualified type name.

ASP.NET searches the specified assembly for the type. If the adapter set inherits from another adapter set, the pageAdapter attribute is not necessary, and will default to the parent set's value.

      

附录C 实例代码:



        '*********************************************************************
        '
        ' HtmlTabbedPanelAdapter.Render Method
        '
        ' Renders the control. The TabbedPanel is rendered as one or more
        ' rows of tabs that the user can click on to move between tabs.
        '
        '*********************************************************************

        Public Overloads Overrides Sub Render(ByVal writer As HtmlMobileTextWriter)
        
            Dim _activePane As IPanelPane = Control.ActivePane
            Dim tabsPerRow As Integer = Control.TabsPerRow
            Dim panes As PanelPaneCollection = Control.Panes
            Dim paneCount As Integer = panes.Count

            ' Figure out the number of visible panes.
            Dim visiblePanes(paneCount) As Integer
            Dim visiblePaneCount As Integer = 0
            Dim i As Integer

            For i = 0 To paneCount - 1

                If CType(panes(i), Control).Visible Then

                    visiblePanes(visiblePaneCount) = i
                    visiblePaneCount += 1

                End If

            Next i

            ' Calculate how many rows are necessary.
            Dim rows As Integer = (visiblePaneCount + tabsPerRow - 1) / tabsPerRow

            ' make sure tabsPerRow doesn't exceed the number of visible panes
            If Control.TabsPerRow > visiblePaneCount Then
                tabsPerRow = visiblePaneCount
            Else
                tabsPerRow = Control.TabsPerRow
            End If

            ' Open the table.
            writer.WriteBeginTag("table")
            writer.WriteAttribute("cellspacing", "0")
            writer.WriteAttribute("cellpadding", "2")
            writer.WriteAttribute("border", "0")
            writer.WriteLine(">")

            Dim row As Integer

            For row = rows - 1 To 0 Step -1

                writer.WriteFullBeginTag("tr")
                writer.WriteLine()

                Dim col As Integer

                For col = 0 To tabsPerRow - 1
                    writer.WriteBeginTag("td")
                    writer.WriteAttribute("width", "0")
                    writer.Write(">")
                    writer.WriteEndTag("td")

                    i = row * tabsPerRow + col
                    If row > 0 And i >= visiblePaneCount Then

                        writer.WriteFullBeginTag("td")
                        writer.WriteEndTag("td")
                        Goto ContinueNextCol

                    End If

                    Dim index As Integer = visiblePanes(i)
                    Dim child As IPanelPane = panes(index)

                    If child Is _activePane Then

                        writer.WriteBeginTag("td")
                        writer.WriteAttribute("bgcolor", GetColorString(Control.ActiveTabColor, "#333333"))
                        writer.Write(">")

                        writer.WriteBeginTag("font")
                        writer.WriteAttribute("face", "Verdana")
                        writer.WriteAttribute("size", "-2")
                        writer.WriteAttribute("color", GetColorString(Control.ActiveTabTextColor, "#000000"))
                        writer.Write(">")

                        writer.WriteFullBeginTag("b")
                        writer.Write(" ")
                        writer.WriteText(child.Title, True)
                        writer.Write(" ")
                        writer.WriteEndTag("b")

                        writer.WriteEndTag("font")

                        writer.WriteEndTag("td")
                        writer.WriteLine()
                    Else
                        writer.WriteBeginTag("td")
                        writer.WriteAttribute("bgcolor", GetColorString(Control.TabColor, "#cccccc"))
                        writer.Write(">")

                        writer.WriteBeginTag("font")
                        writer.WriteAttribute("face", "Verdana")
                        writer.WriteAttribute("size", "-2")
                        writer.WriteAttribute("color", GetColorString(Control.TabTextColor, "#000000"))
                        writer.Write(">")

                        writer.Write(" ")
                        writer.WriteBeginTag("a")
                        RenderPostBackEventAsAttribute(writer, "href", index.ToString())
                        writer.Write(">")
                        writer.WriteText(child.Title, True)
                        writer.WriteEndTag("a")
                        writer.Write(" ")

                        writer.WriteEndTag("font")

                        writer.WriteEndTag("td")
                        writer.WriteLine()
                    End If
ContinueNextCol:
                Next col
                writer.WriteEndTag("tr")
                writer.WriteLine()

                If row > 0 Then
                    writer.WriteFullBeginTag("tr")
                    writer.WriteBeginTag("td")
                    writer.WriteAttribute("height", "1")
                    writer.Write(">")
                    writer.WriteEndTag("td")
                    writer.WriteEndTag("tr")
                    writer.WriteLine()
                End If
            Next row

            writer.WriteEndTag("table")
            writer.WriteLine()

            writer.WriteBeginTag("table")
            writer.WriteAttribute("width", "100%")
            writer.WriteAttribute("height", "2")
            writer.WriteAttribute("border", "0")
            writer.WriteAttribute("cellspacing", "0")
            writer.WriteAttribute("bgcolor", "#000000")
            writer.Write(">")
            writer.WriteFullBeginTag("tr")
            writer.WriteFullBeginTag("td")
            writer.WriteEndTag("td")
            writer.WriteEndTag("tr")
            writer.WriteEndTag("table")
            writer.WriteBreak()

            CType(_activePane, Control).RenderControl(writer)

        End Sub


编写者


日期


关键词


郑昀@ultrapower


2005-7-28


Wap ASP.NET Mobile control device adapter

 

时间: 2024-09-16 05:40:34

[Wap]自定义asp.net mobile control的相关文章

ASP.NET Server Control Design Time Support

asp.net|server ASP.NET Server Control Design Time Support 做过自己的 asp.net server control 了吗?有没有象 ASP.NET DataGrid 控件那样:1.从 Toolbox 一拽出来,自动产生一堆代码2.right click 看属性时,有一大堆 custom attribute3.还能进入 template edit 模式把 toolbox 里的 textbox 之类的东东拽到你的控件中4.甚至还能弹出一个自己

Sophos Mobile Control设备管理、电子邮件管理和安全

为您的用户提供最新的移动技术,同时保持组织数据的安全.我们利用无线控制帮您保护.监控和控制移动设备.自助服务门户移动管理简单,并让自带设备(BYOD) 不再成为 IT 管理员的恶梦.可选择满足您需求的交付模式. 主要优点 适用于所有最新移动平台的单一解决方案 基于角色的简单网页控制台 可远程推出政策和应用程序 应用政策并分配设备至Active Directory 组 定期检查设备合规性 远程定位.锁定和删除设备内容 保护数据安全,且数据遵从法规 Sophos Mobile Control 让您的

自定义ASP.NET UpdatePanel控件的错误处理

先决条件 若要在您自己的开发环境中实现这些过程,您需要: Microsoft Visual Studio 2005 或 Microsoft Visual Web Developer 速成版. 一个支持 AJAX 的 ASP.NET 网站. 在服务器代码中自定义错误处理 首先,您将通过使用页面中的服务器代码自定义错误处理. 在服务器代码中自定义错误处理 创建新页并切换到"设计"视图. 在工具箱的"AJAX Extensions"选项卡中,双击 ScriptManage

IIS支持WAP及ASP生成WML的设置方法_win服务器

首先在打开IIS,然后在默认网站的属性–HTTP头–MMIE映射–文件类型–添加注册文件的类型: 复制代码 代码如下: Associated Extension MIME Type wml text/vnd.wap.wml wmlc application/vnd.wap.wmlc wbmp image/vnd.wap.wbmp wmlsc application/vnd.wap.wmlscriptc wmls text/vnd.wap.wmlscript wsc application/vnd

自定义ASP.NET Ajax Extender控件

问题描述 前言:熟悉ASP.NETAjax的人都对AjaxControlToolkit里的Extender控件留有非常深的印象.有了Extender控件就可以在原有页面上指定某个服务器控件实施Ajax行为(Behavior).如:常用的CalendarExtender控件.下面内容介绍怎样自定义一个AjaxExtender控件实现Panel服务器控件的高亮边框效果.如图所示.正文:创建一个Extender控件需要完成两个部分的工作.第一,创建客户端的行为(Behavior)控件:第二,创建服务器

asp.net AutoComplete Control

asp教程.net  autocomplete control <%@ page language="c#" %> <%@ register tagprefix="ajax" namespace="ajaxcontroltoolkit"  assembly="ajaxcontroltoolkit" %> <%@ import namespace="system.linq" %&

【小技巧】自定义asp.net mvc的WebFormViewEngine修改默认的目录结构

先看一下我的解决方案的目录结构吧--- 一:先把Controller程序提取出来 默认的情况是所有的****Controller.cs文件都会放在Web程序集下的一个叫Controllers的文件夹下 这样感觉有点不爽(你懂的...) 我们决定把所有的Controller程序放到一个自定义的应用程序集中去(上图中的mrlh.Admin.Controllers) 先把web程序集下的Global.asax.cs文件删掉 然后把Global.asax的标记代码改为如下: <%@ Applicatio

自定义asp.net控件分析(二)

上一篇分析了自定义控件的基本语法.这次编写一控件来作为实例. 在asp.net中当你想对button的click事件做确认操作,但Button按钮不能满足此要求.就针对此要求来编写自己的控件. ====================================================================== 继承:System.Web.UI.WebControls.Button 控件功能:弹出确认消息框 控件属性:message(消息框中显示的信息) 控件方法:不需要

启用和自定义 ASP.NET Web API 服务的安全性

对于最常见的场景 - Web 页面中的 JavaScript 访问同一站点上的 Web API 服务,讨论 ASP.NET Web API 的安全性几乎是多余的.如果对用户执行身份验证和授权对 Web 窗体/视图(包含使用服务的 JavaScript)的访问均已设置,则服务可能已具备其所需的所有安全性了.这要归因于 ASP.NET,它会将其用 于验证页面请求的 Cookie 和身份验证信息作为对服务方法的任意客户端 JavaScript 请求的一部分进行发送 .但有一个非常重要的例外: ASP.