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

时间:2016-01-28 02:23:23

标签: c# asp.net drop-down-menu updatepanel selectedindexchanged

我在我的母版页中使用<base href="http://localhost:80/">作为基本网址

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

我试图弄清楚,但在firefox控制台的网络标签中,我发现该请求仅在url而不是{{1}的基座localhost:80/contenpage.aspx上查找内容页面并提供错误

  

无法找到资源。

3 个答案:

答案 0 :(得分:2)

相关情况是默认情况下,表单操作设置为ASP.NET中的相对URL:

<form id="ctl01" action="./webform1" method="post">
    <!-- ... -->
</form>

如果您使用base标记,则更改网页用于解释相对网址的基本路径。在您的情况下,base URL指向显然无法提供应用程序页面的路径。为了解决这个问题,我会重新考虑是否需要base标记。如果是,则应指向能够为应用程序页面提供服务的URL。要动态设置应用程序基本路径的base路径,可以使用以下代码:

protected void Page_Load(object sender, EventArgs e)
{
    baseCtrl.Attributes["href"] = new Uri(Request.Url, "/").OriginalString;
}

如果您需要保留base标记,我还尝试将form操作设置为绝对网址,方法是将以下代码集成到母版中页面:

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

这适用于我的小样本,以便页面可以成功执行PostBack。虽然表单被发布回到相同的位置,就像没有base标签一样,但可能会有一些副作用,因为页面上的其他资源(例如CSS,JavaScript文件等)也可能被引用相对URL,因此可以从其他位置检索。因此,我仍然建议在使用此解决方案之前重新评估base标记。

答案 1 :(得分:1)

如果你有一些带有Autopostback =“true”和ClientIdMode =“Static”的asp组件,你必须使用triger!

像这样:

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

答案 2 :(得分:1)

尝试在表单action中指定绝对网址。