我有一个带有通过用户控件构建的转发器的aspx webforms页面。每个中继器项都有一个链接按钮。我想要发生的是,当单击LinkButton(在页面A的用户控件的转发器中)时,将在新选项卡中打开URL,并传递该LinkButton旁边的隐藏ID(根据Web开发最佳安全实践)如果可能的话)到新选项卡中的aspx页面(页面B)。
页面A和页面B都在同一个应用程序中。
上述内容的目的是使用户在返回后可以轻松返回搜索结果。通过点击LinkButton打开URL。
我对如何做到更接近标准最佳实践方法的想法持开放态度。
到目前为止,我尝试过:
1)跨页面发布 - 这适用于传递ID,但不适用于在新标签页中打开。
2)将PostBackUrl设置为B页的url,使用OnClientClick调用javascript设置Page.Form.Target =“_ blank”,将用户控件的隐藏ID设置为页面B上html隐藏输入的值,并且。
3)我也尝试在OnClientClick中使用window.open(“page B url”,“_ newtab”)。
a)到目前为止,唯一正确工作的方法是上述3种不同方法中的第2种方法。
但是,在新标签中加载页面B后,我不知道如何重置页面A的Page.Form.Target回到之前的状态,然后再将其设置为“_blank”
b)我尝试过重置Page.Form.Target但无效的方法是:
1)重置第A页的Page_Load中的目标,其中IsPostBack == true - >导致页面B加载的内容与页面A相同。
2)在页面A的用户控件的Page_Load - >中重置目标。与方法1相同的结果
3)在页面A的用户控件中重置目标A的用户控件的LinkButton的OnUnLoad - >与方法1相同的结果
4)通过LinkButton的OnClientClick - >重置javascript中的目标没用?
5)使用页面A中包含引用的公共变量(页面A的表单)重置页面B的Page_Load中的目标(类似于通过跨页面发布可以完成的操作) - >没用。
接下来尝试的是:
1)在asp面板(面板B)中包装页面A上的另一个用户控件以显示页面B的内容
2)将B页的内容放入新的用户控制页面
3)将搜索结果内容包装在asp面板(面板A)的第A页上。
4)单击新用户控件上转发器中的LinkButton时,将隐藏面板A中的搜索结果内容,并显示Panel B.
5)当用户想要返回搜索结果时,他们将点击面板B内容中的“返回搜索”LinkButton,然后将隐藏面板B,然后面板B将被清除,面板A将再次显示。
我还不确定这是否会奏效。
这似乎不应该是那很难。
这是一个直截了当的概念,我认为这是网络发展中相当普遍的情况。
我觉得Wiley Coyote试图抓住Road Runner,因为我提出了精心设计的智能,经过深思熟虑的计划,这些计划都完全失败了。
我现在举着一个小小的牌子, “救命啊!
答案 0 :(得分:1)
我通过以下代码解决了同样的问题,您只需在GRIDVIEW
中的按钮的HTML页面中尝试此操作:
<asp:LinkButton ID="LinkButton1" runat="server" Text="View" CommandArgument='<%# Bind("ref") %>'
OnClick="LinkButton1_Click" OnClientClick="document.forms[0].target ='_blank';">View</asp:LinkButton>***
答案 1 :(得分:0)
我实际上弄明白了。
我通过这篇文章的标记答案How to Open new tab when we click on LinkButton以及此帖Is it possible add click event to hyperlink?上的标记答案的组合来解决这个问题。
用户控件的转发器中的 Repeater ItemTemplate 类似于:
<asp:HiddenField ID="hfId" runat="server"
Value='<%# Eval("Id") %>'/>
<asp:HyperLink ID="myLink" runat="server"
Text='<%# Eval("Name") %>'
NavigateUrl="/myUrl.aspx"
Target="_blank" />
<asp:Button ID="btnSubmit" runat="server"
Text="Submit"
OnClick="BtnClick"
Style="display: none;" />
这是我在转发器的 ItemDataBound中的代码:
protected void RptrItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var myId = "";
var myNameLink = e.Item.FindControl("myLink") as HyperLink;
if (myNameLink != null)
{
var submitButton = e.Item.FindControl("btnSubmit") as Button;
if (submitButton != null)
{
var submitButtonClientId = submitButton.ClientID;
myNameLink.Attributes.Add("onclick", "onNameClick('" + submitButtonClientId + "')");
}
}
}
}//end RptrItemDataBound
javascript代码:
<script type="text/javascript">
function nameClick(buttonId)
{
document.getElementById(buttonId).click();
}
</script>
这是 BtnClick C#代码:
protected void BtnClick(object sender, EventArgs e)
{
var btnSelect = sender as Button;
if (btnSelect == null)
{
return;
}
var myListItem = (RepeaterItem)btnSelect.DataItemContainer;
if (myListItem != null)
{
var hfId = myListItem.FindControl("hfId") as HiddenField;
if (hfId != null)
{
var intId = int.Parse(hfId.Value);
Session["selectedId"] = intId;
}//end if (hfId != null)
}//end if (myListItem != null)
}//end btnClick