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
标记。
我在我的母版页中使用 <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
.
相关情况是表单动作默认设置为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
标记。