65.9K
CodeProject 正在变化。 阅读更多。
Home

用于 ActiveX 激活修复的 .NET 2.0 服务器控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.78/5 (7投票s)

2006年8月23日

CPOL

3分钟阅读

viewsIcon

47670

downloadIcon

504

一个 .NET 2.0 服务器控件,用于修复由 Internet Explorer 更新引起的 ActiveX 激活问题。

引言

作为微软最近推出的一系列 Internet Explorer 更新的一部分,ActiveX 控件(包括 Flash Player 和 QuickTime player)已经开始提示用户单击控件来激活它们。

这种行为突然导致网页变得不那么有吸引力,破坏了现有应用程序,并给 Web 开发人员带来了麻烦。此问题的解决方法已被明确记录,但实施起来仍然很麻烦。本文介绍了一个 .NET 2.0 控件,旨在不仅解决此问题,而且使修复易于实施。

背景

绕过激活提示问题的方法很简单。

  1. 在您的 HTML 文件中创建一个对外部 JavaScript 文件的引用。JavaScript 文件应包含一个函数,该函数将使用 document.write() 写入 <object> 标签以及所有通常直接放在 HTML 文件中的关联 HTML 代码。
  2. 从您的网页调用 JavaScript 函数。

上述方法的问题在于,为了实现它,您每次都必须编写自定义 JavaScript,而编写 JavaScript 来 "document.write()" 可能会导致很多错误,而且非常耗时。

服务器控件

除了编写 Javascript 之外,另一种方法是创建一个服务器控件,只需简单地包装您网站上现有的 HTML 代码即可。以下是您现有的 HTML 代码可能的外观

<object id="flash1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
  codebase="http://fpdownload.macromedia.com/pub/shockwave/
            cabs/flash/swflash.cab#version=8,0,0,0" 
  width="419" height="320" align="middle">
        <param name="allowScriptAccess" value="sameDomain" />
        <param name="movie" value="/myFlash.swf" />
        <param name="quality" value="high" />
        <param name="bgcolor" value="#ffffff" />
        <embed src="/myFlash.swf" quality="high" bgcolor="#ffffff" 
          width="419" height="320" name="map" align="middle" 
          allowScriptAccess="sameDomain" type="application/x-shockwave-flash" 
          pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

以下是您的 HTML 将如何使用 .NET 2.0 服务器控件进行更改

<form runat="server">
<WH:JsWriter runat="server" >
    <object id="flash1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
            codebase="http://fpdownload.macromedia.com/pub/
                      shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
            width="419" height="320" align="middle">
        <param name="allowScriptAccess" value="sameDomain" />
        <param name="movie" value="/myFlash.swf" />
        <param name="quality" value="high" />
        <param name="bgcolor" value="#ffffff" />
        <embed src="/myFlash.swf" quality="high" 
          bgcolor="#ffffff" width="419" height="320" 
          name="map" align="middle" allowScriptAccess="sameDomain" 
          type="application/x-shockwave-flash" 
          pluginspage="http://www.macromedia.com/go/getflashplayer" />
    </object>
</WH:JsWriter>
</form>

.NET 服务器控件获取文字内容并将其放入一个 JavaScript 变量中。服务器控件的 Render 方法用于输出 JavaScript 代码。

protected override void Render(HtmlTextWriter output)
{
    string[] htmlLines = (this.InnerHtml.Trim()).Split('\n');
    string outString = "";
    for (int i = 0; i < htmlLines.Length; i++)
    {
        string currentLine = htmlLines[i].Replace("'", 
                    "\\'").Replace("\r", "");
        if (i > 0)
            outString += "+";
        if (i == htmlLines.Length - 1)
            outString += "'" + currentLine + "';\n";
        else
            outString += "'" + currentLine + "'\n";
    }
    string varName = "objStr_" + this.UniqueID;
    output.Write("<script language="\""javascript\">");
    output.Write(Environment.NewLine);
    output.Write("var " + varName + " = " + outString);
    output.Write(Environment.NewLine);
    output.Write("InsertObjectToDocument(document," + varName + ");");
    output.Write(Environment.NewLine);
    output.Write("</script>");
}

运行上述代码会创建输出

<script language="Javascript">
var objStr = ''
+'<object id=\"flash1\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" ' 
+ 'codebase=\"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/' 
+ 'swflash.cab#version=8,0,0,0\" width=\"419\" height=\"320\" align=\"middle\">'
+'<param name=\"allowScriptAccess\" value=\"sameDomain\" />'
+'<param name=\"movie\" value=\"/myFlash.swf\" />'
+'<param name=\"quality\" value=\"high\" />'
+'<param name=\"bgcolor\" value=\"#ffffff\" />'
+'<embed src=\"/myFlash.swf\" quality=\"high\" ' 
+ 'bgcolor=\"#ffffff\" width=\"419\" height=\"320\" ' 
+ 'name=\"map\" align=\"middle\" allowScriptAccess=\"sameDomain\" ' 
+ 'type=\"application/x-shockwave-flash\" ' 
+ 'pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />'
+'</object>';  
InsertObjectToDocument(document,objStr);
</script>

生成的 JavaScript 代码将输出 ActiveX 控件,而没有烦人的“单击以激活并使用此控件”消息。方法 InsertObjectToDocument 在一个 JavaScript 文件中定义,该文件嵌入到 DLL 中,如下所述。

.NET 2.0 优势

此代码本来可以在 .NET 1.1 中工作,但是我们利用了一个非常棒的 .NET 2.0 功能,该功能使此控件不向后兼容。使用 Web 资源功能,此控件能够自包含其自己的 JavaScript 函数。这意味着您可以简单地将控件拖放到 ASPX 页面上,而无需像在 .NET 1.1 中那样担心复制 JavaScript 文件。

此条目必须放入 AssemblyInfo.cs

[assembly: WebResource("JavascriptWriters.JavascriptWriters.js", "text/Javascript")]

以下代码放在服务器控件的类文件中,JsWriter.cs

protected override void OnPreRender(EventArgs e)
{
   Page.ClientScript.RegisterClientScriptInclude("jsWritersScript", 
     Page.ClientScript.GetWebResourceUrl(this.GetType(), 
                       "JavascriptWriters.javascriptWriters.js"));
   base.OnPreRender(e);
}

然后在 JavaScriptWriters.js 中,放入支持的 JavaScript 函数。

保存 FORM 标签!

如果您不想仅将您的宝贵的 form 标签用于此解决方法,您可以简单地省略 form runat="server",而是仅在已包含在您网页上的 JavaScript 文件中包含以下 JavaScript 函数。

function InsertObjectToDocument(toDocument, insertObject)
{
    toDocument.write(insertObject); 
}

设计时支持

此控件的优点之一是,它有助于保留设计时布局功能,用于 Dreamweaver 和 Visual Studio 等工具中的 object 标签。

© . All rights reserved.