2

我在 Visual Studio 项目(.NET 框架 3.5)中有一个简单的 ASP.NET 下拉列表控件,一旦所选索引更改并成功回发到服务器,它就会触发回发。采用相同的简单 ASP.NET 下拉列表控件并将 Visual Studio 项目升级到 .NET Framework 4.0 不会导致回发。以下是页面上的标记示例(页面仅包含一个下拉列表)

<body>
  <form id="form1" runat="server" >
    <asp:DropDownList ID="ddlTest" OnSelectedIndexChanged="ddlTestIndexChanged" runat="server"
     AutoPostBack="true" />
 </form> 
</body>

在后面的代码中......

public void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                var list = new List<string>();
                list.Add("Hello");
                list.Add("World");
                ddlTest.DataSource = list;
                ddlTest.DataBind();
            } 
        }
        protected void ddlTestIndexChanged(object sender, EventArgs e)
        {  
            //selected index changed...success
        }

当项目在 .NET Framework 3.5 上运行时,使用 FireBug 在浏览器中查看呈现的 html 会显示以下 html

<body>
 <form name="form1" method="post" action="Default.aspx" id="form1">
 <div>
 <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="">
 <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="">
 <input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="">
 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="has a value">
</div>
 <script type="text/javascript"> //<![CDATA[ var theForm = document.forms['form1']; 
    if (!theForm) { theForm = document.form1; } function __doPostBack(eventTarget, eventArgument)
     { if (!theForm.onsubmit || (theForm.onsubmit() != false)) 
    { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; 
    theForm.submit(); } } //]]> </script>
 <div>
 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="Has a value">
</div>
 <select name="ddlTest" onchange="javascript:setTimeout('__doPostBack(\'ddlTest\',\'\')', 0)" id="ddlTest">
 <option value="Hello">Hello</option>
 <option selected="selected" value="World">World</option>
</select>
</form>
</body>

并在 .NET 框架 4.0 上运行同一个项目时查看呈现的 html

<body>
 <form name="form1" method="post" action="/Default.aspx" id="form1">
 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="has a value">
 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="has a value">
 <select name="ddlTest" id="ddlTest">
 <option selected="selected" value="Hello">Hello</option>
 <option value="World">World</option>
</select>
</form>
</body>

通过比较两个片段中的 html 代码,可以看出后一个片段缺少下拉列表中的“onchange”事件以及用于回发的 javascript 本身。我的 web.config 包含以下内容以实现向后兼容性,但这也不起作用。

<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>

我还尝试在标记中添加缺少的 Javascript——没有用。此外,尝试从后面的代码中添加 onchange 事件 + javascript,但这也不起作用

环境:

  • 基于 Adob​​e AIR 3.2 的浏览器(无法访问浏览器代码)
  • Windows 7 – 64 位机器
  • 视觉工作室 2010
  • C#

我知道这个问题在大多数浏览器上都不是问题,但是作为工作项目的一部分,这需要使用基于 Adob​​e AIR 3.2 的浏览器。非常感谢任何帮助,谢谢!

4

2 回答 2

0

我在本地计算机上复制了您的 ASPX 和 ASPX.cs,它在 .NET 框架 4.0 上运行良好。我可以看到下拉菜单有 onchange 事件。

<select id="ddlTest" onchange="javascript:setTimeout('__doPostBack(\'ddlTest\',\'\')', 0)" name="ddlTest">
    <option value="Hello" selected="selected">Hello</option>
    <option value="World">World</option>

</select>

检查您的 web.config 并查看 targetFramework 是什么:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

</configuration>
于 2012-04-27T19:58:59.943 回答
0

解决方案是在我的网站项目中添加一个“App_Browsers”文件夹。然后添加一个“AdobeAir.Browser”文件。这是一个包含我的自定义浏览器属性的 xml 文件。请参阅http://msdn.microsoft.com/en-us/library/ms228122.aspx了解更多信息。

位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Browsers 的 .NET 框架 4 浏览器定义文件与位于 C:\Windows\Microsoft.NET\Framework64\v2.0.50727 的文件相比稍微轻了一点\CONFIG\Browsers 因此我的自定义浏览器在 .NET 框架 4 上运行

于 2012-05-19T01:15:40.620 回答