Мастер-страница добавляет дополнительный текст в TextBox ID - PullRequest
3 голосов
/ 24 сентября 2011

У меня есть главная страница с разделом контента с идентификатором cpMainContent.Я использую эту мастер-страницу в каждой веб-форме, которую я создаю для проекта колледжа.Одной из таких форм является frmSearchPersonnel.Цель frmSearchPersonnel - запросить у пользователя фамилию человека, которого он хочет найти, в текстовом поле, а затем нажать кнопку поиска.Идентификатор TextBox

        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, но при отображении страницы добавляется дополнительная строка из главной страницы.

  1. Как я могу это остановить?Я должен использовать главную страницу, поэтому не говорите, чтобы не использовать главную страницу:)
  2. Почему это происходит?

Обновление

При поиске и поиске я обнаружил, что в этом случае могу использовать Control.ClientID, так что изучите его.

Обновление 2

Как предлагается ниже, добавить ClientIDMode = "static" в HTML-элемент управления или добавить его в директиву страницы.Он сохраняет статический идентификатор для txtSearchName, но проблема в том, что

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

Здесь имя все еще использует ctl00 и код, который я показал выше,

            string strSearch = myRequest["txtSearchName"] 

это все ещене будет работать, потому что коллекция nvc доступна для поиска по индексу или по имени, а не по идентификатору напрямую.

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

Ответы [ 4 ]

5 голосов
/ 24 сентября 2011
  1. Вам необходимо добавить ClientIDMode = "Static" в html текстового поля:
<asp:TextBox ID="txtSearchName" runat="server" ClientIDMode="Static" />
  1. Это происходит для предотвращения дублирования идентификаторов. Обычно это происходит, когда вы используете главные страницы, так как они содержат вложенные страницы

Если вам нужны все элементы управления с ClientIDMode="Static", вы можете поместить его в заголовок страницы основного файла.

<%@ Page Language="C#" ClientIDMode="Static" %>
4 голосов
/ 24 сентября 2011

Если вы публикуете на другой странице, которая использует ту же главную страницу (в моем случае это называется SiteMaster), имя текстового поля должно быть таким же.

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

Если вы НЕ публикуете на странице с одним и тем же мастером, хорошо, тогда вы вообще используете viewstate для текстового поля, так как вы публикуете на другой странице? Если нет, просто сделайте элемент управления не asp.net:

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

Если вы используете viewstate и отправляете сообщения на другую страницу с другой главной страницей, хорошо, вы должны использовать PreviousPage.

2 голосов
/ 24 сентября 2011

Немного поздно здесь.Ценю @aquinas и @rudeovski ze bear.Интересные и хорошие ответы.

У меня была бы такая же проблема, и я решил ее по-другому.

На самом деле я использовал публичный интерфейс.

public interface ISearch
{
      string SearchText { get; }
}

Затем внедрили ISearch интерфейс на двух страницах aspx говорит: One.aspx и Two.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();
        }

    }
}
0 голосов
/ 03 ноября 2017

Если вы пытаетесь получить доступ к значению элемента ввода в коде, указанном в сообщении, вместо, например,

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