母版页正在 TextBox ID 中添加附加文本

发布于 2024-12-06 09:34:17 字数 1383 浏览 1 评论 0原文

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

        txtSearchName

Search 按钮,会将 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. 为什么要这样做?

更新

当谷歌搜索和必应时,我发现在这种情况下我可以使用 Control.ClientID,因此请研究它。

更新 2

按照下面的建议,在控件的 html 中添加 ClientIDMode="static" 或在页面指令中添加它。它的作用是,它将 ID 保持静态到 txtSearchName 但问题是这样的,

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

这里名称仍然使用 ctl00 和我上面显示的代码,

            string strSearch = myRequest["txtSearchName"] 

它仍然无法工作,因为 nvc 集合可以通过索引或名称直接搜索,而不是直接通过 id 。

============= 在此处输入图像描述

I have a master page which has a content section with the id cpMainContent.
I am using this master page on every webform I am creating for college project. One of such form is frmSearchPersonnel. The purpose of frmSearchPersonnel is to ask user last name of the person they want to search in a textbox and then click on search button. The ID of TextBox is

        txtSearchName

Search button will do postbackUrl transfer to another form which I have named frmViewPersonnel.
In frmViewPersonnel I am trying to use following code.

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

The problem I ran into is that this didn't find any control with the name of txtSearchName. While debugging I found this in myRequest object,

                [5] "ctl00$cpMainContent$txtSearchName" string

Even though when I added textbox I gave it ID of txtSearchName but when page is rendered it is adding extra string from master page.

  1. How can I stop this? I have to use master page so don't say not to use master page :)
  2. Why is it doing that?

Update

While Googling and Binging I found that I can use Control.ClientID in this case so looking into it.

Update 2

As suggested below to add ClientIDMode="static" in the html of control or add it in page directive. What it does is, it keeps the ID static to txtSearchName but problem is this,

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

Here name is still using ctl00 and the code I showed above,

            string strSearch = myRequest["txtSearchName"] 

it still won't work because nvc collection is either searchable by index or name not the id directly.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

伪心 2024-12-13 09:34:17
  1. 您需要将 ClientIDMode="Static" 添加到文本框的 html 中:

  1. 它恰好可以防止重复的 ID。通常,当您使用母版页时会发生这种情况,因为母版页包含嵌套页面。

如果您希望所有控件都带有 ClientIDMode="Static",则可以将其放在母版文件的页眉中。

<%@ Page Language="C#" ClientIDMode="Static" %>
  1. You need to add a ClientIDMode="Static" to the html of the textbox:
<asp:TextBox ID="txtSearchName" runat="server" ClientIDMode="Static" />
  1. It happens to prevent duplicate ID's. Usually it happens when you use master pages as it contains nested pages

If you want all controls with ClientIDMode="Static", you can put it in the page header of the master file.

<%@ Page Language="C#" ClientIDMode="Static" %>
So要识趣 2024-12-13 09:34:17

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

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

如果您不发布到具有相同母版的页面,那么您是否在发布到另一个页面后根本使用文本框的视图状态?如果不是,只需将该控件设置为非 asp.net 控件:

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

如果您正在使用视图状态发布到具有不同母版页的另一个页面,那么您应该使用 PreviousPage 。

If you are posting to another page that uses the same master page (called SiteMaster in my case), the name of the textbox should be same the same.

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

If you're NOT posting to a page with the same master, well, then are you using the viewstate for the textbox at all since you're posting to another page? If not, just make the control a non asp.net control:

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

If you are using viewstate and posting to another page with a different master page, well, you should use PreviousPage.

未蓝澄海的烟 2024-12-13 09:34:17

这里有点晚了。感谢@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();
        }

    }
}

Little late here. Appreciate @aquinas and @rudeovski ze bear. Interesting and good answers.

I'd same issue and I solved it differently.

In fact, I used a public Interface.

public interface ISearch
{
      string SearchText { get; }
}

Then implement ISearch interface in two aspx page say One.aspx and Two.aspx classes.

--One.aspx-- (Where I'v added TextBox1, and Button1 and set 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();
        }

    }
}
人疚 2024-12-13 09:34:17

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

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

If your try to access the input element value in code behind on post back instead of for example:

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

Use

  var emailAddressKeyName = Request.Form.AllKeys.FirstOrDefault(a => a.Contains("emailaddress1"));
        var emailAddress = Request.Form[emailAddressKeyName]; 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文