母版页在TextBox ID中添加了其他文本

时间:2011-09-24 03:37:40

标签: c# asp.net httpwebrequest master-pages

我有一个母版页,其内容部分的id为cpMainContent。 我正在为大学项目创建的每个webform上使用这个母版页。其中一种形式是frmSearchPersonnel。 frmSearchPersonnel的目的是询问用户他们想要在文本框中搜索的人的姓氏,然后单击搜索按钮。 TextBox的ID是

        txtSearchName

搜索按钮会将postbackUrl传输到另一个名为frmViewPersonnel的表单。 在frmViewPersonnel中我试图使用以下代码。

        NameValueCollection myRequest = Request.Form;
        if(!string.IsEmptyOrNull(myRequest["txtSearchName"]))
           string strSearch = myRequest["txtSearchName"];

我遇到的问题是,没有找到任何名为txtSearchName的控件。调试时我在myRequest对象中发现了这个,

                [5] "ctl00$cpMainContent$txtSearchName" string

即使我添加了文本框,我给它提供了txtSearchName的ID,但是当呈现页面时,它正在从母版页添加额外的字符串。

  1. 我怎么能阻止这个?我必须使用母版页,所以不要说不使用母版页:)
  2. 为什么这样做?
  3. 更新

    谷歌搜索和Binging我发现在这种情况下我可以使用Control.ClientID进行调查。

    更新2

    如下所示,在控件的html中添加ClientIDMode =“static”或在page指令中添加它。它的作用是,它将ID保持为txtSearchName,但问题是这个,

             <input name="ctl00$cpMainContent$txtSearchName" type="text" id="txtSearchName" />
    

    此处名称仍然使用ctl00和我上面显示的代码

                string strSearch = myRequest["txtSearchName"] 
    

    它仍然无法正常工作,因为nvc集合可以通过索引或名称直接搜索,也可以直接搜索。

    ============== enter image description here

4 个答案:

答案 0 :(得分:5)

  1. 您需要在文本框的html中添加ClientIDMode =“Static”:
  2. <asp:TextBox ID="txtSearchName" runat="server" ClientIDMode="Static" />
    
    1. 碰巧会阻止重复的ID。通常在使用母版页时会发生,因为它包含嵌套页面
    2. 如果您希望所有控件都使用ClientIDMode="Static",则可以将其放在主文件的页眉中。

      <%@ Page Language="C#" ClientIDMode="Static" %>
      

答案 1 :(得分:4)

如果您要发布到使用相同母版页的另一个页面(在我的情况下称为SiteMaster),则文本框的名称应该相同。

string val = Request[((SiteMaster)Master).txtSearchName.UniqueID];

如果您没有发布到具有相同主人的页面,那么,您是否正在使用该文本框的视图状态,因为您要发布到另一个页面?如果没有,只需使控件成为非asp.net控件:

<input type="text" name="txtSearchName"/>

如果 使用viewstate 发布到具有不同母版页的其他页面,那么您应该使用PreviousPage。

答案 2 :(得分:2)

这里不太晚。感谢@aquinas@rudeovski ze bear。有趣和好的答案。

我也遇到同样的问题而且我的解决方法不同。

事实上,我使用了公共接口。

public interface ISearch
{
      string SearchText { get; }
}

然后在两个aspx页面中实现ISearch接口,说One.aspxTwo.aspx类。

- One.aspx--(我添加了TextBox1和Button1并设置了Button1.PostBackUrl =“〜/ Two.aspx”)

public partial class One : System.Web.UI.Page , ISearch 
{
    public    string SearchText
    {
        get
        {
            return TextBox1.Text;
        }
    }
}

- Two.aspx -

public partial class Two : System.Web.UI.Page, ISearch 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ISearch search = (ISearch)  PreviousPage;
        Label1.Text = search.SearchText;
    }
    public string SearchText
    {
        get
        {
            throw new NotImplementedException();
        }

    }
}

答案 3 :(得分:0)

如果您尝试在回发后的代码中访问输入元素值而不是例如:

var emailAddress = Request.Form["ctl00$ctl00$ctl00$ContentContainer$MainContent$MainContent$ContentBottom$ProfileFormView$emailaddress1"];  

使用

  var emailAddressKeyName = Request.Form.AllKeys.FirstOrDefault(a => a.Contains("emailaddress1"));
        var emailAddress = Request.Form[emailAddressKeyName];