ASP.Net WebForms LinkBut​​ton单击,打开新选项卡,通过隐藏的html输入变量传递id

时间:2013-03-25 16:11:13

标签: c# asp.net webforms parameter-passing new-window

我有一个带有通过用户控件构建的转发器的aspx webforms页面。每个中继器项都有一个链接按钮。我想要发生的是,当单击LinkBut​​ton(在页面A的用户控件的转发器中)时,将在新选项卡中打开URL,并传递该LinkBut​​ton旁边的隐藏ID(根据Web开发最佳安全实践)如果可能的话)到新选项卡中的aspx页面(页面B)。

页面A和页面B都在同一个应用程序中。

上述内容的目的是使用户在返回后可以轻松返回搜索结果。通过点击LinkBut​​ton打开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的用户控件的LinkBut​​ton的OnUnLoad - >与方法1相同的结果

    • 4)通过LinkBut​​ton的OnClientClick - >重置javascript中的目标没用?

    • 5)使用页面A中包含引用的公共变量(页面A的表单)重置页面B的Page_Load中的目标(类似于通过跨页面发布可以完成的操作) - >没用。


接下来尝试的是:

1)在asp面板(面板B)中包装页面A上的另一个用户控件以显示页面B的内容

2)将B页的内容放入新的用户控制页面

3)将搜索结果内容包装在asp面板(面板A)的第A页上。

4)单击新用户控件上转发器中的LinkBut​​ton时,将隐藏面板A中的搜索结果内容,并显示Panel B.

5)当用户想要返回搜索结果时,他们将点击面板B内容中的“返回搜索”LinkBut​​ton,然后将隐藏面板B,然后面板B将被清除,面板A将再次显示。


我还不确定这是否会奏效。

这似乎不应该是那很难。

这是一个直截了当的概念,我认为这是网络发展中相当普遍的情况。

我觉得Wiley Coyote试图抓住Road Runner,因为我提出了精心设计的智能,经过深思熟虑的计划,这些计划都完全失败了。

我现在举着一个小小的牌子, “救命啊!

2 个答案:

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