asp 在母版页中使用 <base> url 时,下拉列表回发在更新面板中不起作用

asp dropdownlist postback not working in update panel when using <base> url in masterpage

我在我的母版页中使用 <base href="http://localhost:80/"> 作为基础 url,

现在,当我在更新面板中的内容页面(位于 localhost:80/directory1/directory2)上使用 dropdownlist 控件时,selectedindexchanged 事件不起作用。

我试图找出答案,但在 firefox 控制台的网络选项卡中,我发现该请求正在寻找基础 url 的内容页面,只是在 localhost:80/contenpage.aspx 而不是 localhost:80/directory1/directory2/contenpage.aspx 并给出错误

The resource cannot be found.

如果您有一些 asp 组件带有 Autopostback="true" 和 ClientIdMode="Static",您必须使用触发器!

像这样:

<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>

尝试在 action.

形式中指定绝对值 url

相关情况是表单动作默认设置为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 标记。