在使用主页面的<base> URL时,ASP下拉列表框在更新面板中无法回发。

7
我在我的母版页中使用了<base href="http://localhost:80/">作为基本URL,现在当我在内容页中(位于localhost:80/directory1/directory2)使用下拉列表控件(位于UpdatePanel内),selectedindexchanged事件不起作用。
我试图找出原因,但在firefox控制台的网络选项卡中发现请求仅在基本url处寻找内容页,即在localhost:80/contentpage.aspx,而不是在localhost:80/directory1/directory2/contentpage.aspx,并返回错误信息:

资源未找到。


你将AutoPostBack设置为True了吗? - Dr. Stitch
是的,我这样做了。如果我在母版页中注释掉基础标签,一切都正常工作。 - Aniket Bhansali
请检查上述帖子是否有效。看起来与绝对路径和相对路径有关。 - mgopi
嗨@user2846413,上面的帖子解决了我相对URL的其他问题,但我的实际问题仍然存在... 仍然无法触发下拉列表事件..因为我们没有向该事件提供任何URL,我只是像在普通代码中一样绑定了服务器端事件.. - Aniket Bhansali
你能展示一下你的.aspx和code-behind文件吗? - John Riehl
3个回答

2
相关情况是,在ASP.NET中,默认情况下表单动作被设置为相对URL:
<form id="ctl01" action="./webform1" method="post">
    <!-- ... -->
</form>

如果您使用base标签,那么您将更改页面用于解释相对URL的基本路径。在您的情况下,base URL指向一个明显无法服务于应用程序页面的路径。为了解决这个问题,我建议重新考虑是否需要使用base标签。如果需要,它应该指向一个能够服务于应用程序页面的URL。为了将base路径动态设置为应用程序的基本路径,您可以使用以下代码:
protected void Page_Load(object sender, EventArgs e)
{
    baseCtrl.Attributes["href"] = new Uri(Request.Url, "/").OriginalString;
}

如果您需要保留 base 标签,但仍需要解决问题,可以通过将以下代码集成到主页面中,将 form 的操作设置为绝对 URL:

protected void Page_Load(object sender, EventArgs e)
{
    Page.Form.Action = Request.Url.OriginalString;
}

我在我的小样本中测试过,这个页面能够成功执行PostBack。尽管表单被提交回到与没有base标签相同的位置,但是可能会有一些副作用,因为页面上的其他资源(例如CSS、JavaScript文件等)可能也是使用相对URL引用并且从另一个位置检索。因此,在采用这种解决方案之前,仍建议重新评估base标签。


1
如果您使用了带有Autopostback="true"和ClientIdMode="Static"属性的ASP组件,那么您需要使用触发器!就像这样:
<asp:UpdatePanel ID="upPrinceOffuce" runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="myCustomDropdown" EventName="SelectedIndexChanged" />
    </Triggers>
    <ContentTemplate>
         <asp:DropDownList ID="myCustomDropdown" runat="server" ClientIDMode="Static" AutoPostBack="true"
</asp:DropDownList>
    </ContentTemplate>
</asp:UpdatePanel>

1

尝试在表单的action中指定绝对URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接