Как изменить страницу содержимого из мастер-страницы в ASP.NET с помощью С#?

Я видел обратное, когда кодерам нужно изменить главную страницу для определенного контента. Но в данном случае меня больше беспокоит содержание, и я хочу его изменить.

protected void btn_search_Click(object sender, ImageClickEventArgs e)
{
    string pageName = this.ContentPlaceHolder1.Page.GetType().FullName;

    if (pageName != "ASP.ChinaShipManagerHome_aspx")
    {
        // then change it here?!
    }
}

Как вы можете догадаться, в моем случае у меня есть кнопка «Поиск» на главной странице. Однако они могли отклониться от контента, с которым должен взаимодействовать «поиск». Поэтому, когда они нажимают «поиск», ему нужно вернуться к правому «Содержимому» в «ContentPlaceHolder1».

Что вы имеете в виду, "они, возможно, отклонились от содержания"?

mason 28.12.2022 17:26

@mason ChinaShipManagerHome — страница по умолчанию. Однако они могут щелкать и делать что-то на других страницах, а основная страница остается (что вполне нормально). Много страниц, один Мастер, верно? Тем не менее, было бы неплохо нажать поиск еще раз. Я начинаю задаваться вопросом, что это может быть невозможно. По крайней мере так, как я просил. Мне может понадобиться «перенаправить» строку поиска в запросе на «ChinaShipManagerhome». Это может быть единственным ответом.

Robert Koernke 28.12.2022 17:36

Я знаю, как работают эталонные страницы, поскольку пользуюсь веб-формами уже 13 лет. Я не понимаю, что может помешать им снова щелкнуть поиск после того, как они ранее посещали результаты поиска. Что их останавливает?

mason 28.12.2022 17:37

Однако ничто их не останавливает: как он покажет результаты, если страница ContentPlaceHolder1 изменилась? Результаты поиска попадают только в сетку, которая появляется здесь: 'ChinaShipManagerHome'. В настоящее время кнопка поиска просто отправляет их домой.

Robert Koernke 28.12.2022 17:40

Какая сетка? В вашем вопросе нет сетки. Нам не хватает необходимого контекста о том, как вы реализовали эту функцию поиска, чтобы дать разумную рекомендацию о дальнейших действиях.

mason 28.12.2022 17:42

я не просил каких-либо рекомендаций для sae. Я просто спросил: «Как изменить страницу содержимого из мастер-страницы в ASP.NET с помощью C#?». И я показал, где именно в коде я хотел это вставить. Ты мог сказать мне, что я не могу этого сделать. Думаю, я опубликую ответ о том, что я буду делать. Потому что я думаю, что ответ на самом деле таков: я не могу делать то, что прошу. Но способ решить это - перенаправление со строкой запроса - единственный способ.

Robert Koernke 28.12.2022 17:53

Это хороший пример задачи XY. Я знаю, что вы не спрашивали рекомендаций о том, как это изменить, но на самом деле звучит так, как будто то, что вы пытаетесь сделать (Y), не имеет смысла с точки зрения дизайна, поэтому лучше знать, каков ваш контекст ( X) может помочь нам лучше помочь вам.

mason 28.12.2022 18:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это должно работать:

    protected void Page_Load(object sender, EventArgs e)
    {
        string pageName = MainContent.Page.GetType().FullName;

        if (pageName == "ASP.default_aspx")
        {
            // get text box 1 on child page.

            TextBox tbox1 = (TextBox)MainContent.FindControl("TextBox1");
            tbox1.Text = "Hello world";

        }
    }

Я предполагаю, что управление содержимым на главной странице выглядит следующим образом:

    <div class = "container body-content">
        <asp:ContentPlaceHolder ID = "MainContent" runat = "server">
        </asp:ContentPlaceHolder>
        <hr />
        <footer>
            <p>&copy; <%: DateTime.Now.Year %> - My ASP.NET Application</p>
        </footer>
    </div>

И, таким образом, на дочерней странице «default.aspx» я предположил следующее:

<asp:Content ID = "BodyContent" ContentPlaceHolderID = "MainContent" runat = "server">

поэтому мы можем/должны иметь возможность использовать FindControl для этого «основного контента», как указано выше.

Редактировать:

Однако похоже, что постер хочет изменить главную страницу с дочерней страницы.

Хорошо, тогда предположим, что наше текстовое поле находится на главной странице, и мы хотим перейти с дочерней страницы?

Конечно, тогда это:

    protected void Page_Load(object sender, EventArgs e)
    {
        // this is child page load event, change a
        // change TextBox1 that is in master page
        
        TextBox tb1 = (TextBox)Page.Master.FindControl("TextBox1");
        tb1.Text = "hello world";

    }

Редактировать № 2: как перенаправить на другую страницу

Во многих случаях я скажу, что пользователи переходят на страницу, но это НЕ та страница, которую я хочу.

Например, у меня есть страница проекта, и мы можем попасть на эту страницу ТОЛЬКО из MyProjects.

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

Так, например, если мы говорим, что набрали страницу Project.aspx (это дочерний элемент master), но я хочу «изменить», какую страницу получает пользователь?

Я помещу такой код в загрузку даже дочерней страницы.

сказать:

if (Session["Projectinfo"] = null 
{
     // no project information passed, send user back to 
     // my projects page
     response.redirect("MyProjects.aspx")
}

поэтому, как правило, вы не хотите размещать такой код на главной странице, так как тогда код главной страницы со временем превратится в большой беспорядок, поскольку теперь вы помещаете логику в главную страницу, которая в 99% случаев принадлежит данному коду страницы.

Тем не менее, такой код МОЖЕТ находиться на главной странице, и для отображения другой страницы мы не пытаемся / пытаемся заменить страницу содержимого, а на самом деле просто делаем простой переход на страницу, которую мы хотим, и эта страница Таким образом, будучи дочерней страницей мастер-страницы, она будет продолжать отображать главную страницу, и после перехода на правильную дочернюю страницу все будет хорошо.

Таким образом, нам не нужно «изменять», какой шаблон контента отображается, а просто перейти к этой дочерней странице с помощью простого response.redirect. Поскольку эта дочерняя страница все равно будет отображать главную страницу, мы достигли той же цели, что и замена/изменение дочерней страницы, которую мы все равно собираемся отображать, верно?

Другими словами, простого response.redirect должно быть достаточно, чтобы «изменить», какую дочернюю страницу мы должны отображать.

Редактировать № 3: кнопка поиска находится в / на строке меню (главная страница).

Как я уже неоднократно говорил, нам действительно НЕ важно, ГДЕ поиск и кнопка.

Вопрос НА САМОМ ДЕЛЕ таков:

У меня есть текстовое поле и кнопка. Пользователь введет некоторые критерии поиска и нажмет кнопку. Затем я хочу перейти на страницу для отображения результатов поиска.

На самом деле, это САМЫЙ основной вопрос веб-101 на планете.

В таких случаях и СУПЕР распространены? Мы должны взять этот критерий поиска и передать его на целевую страницу. Я имею в виду, как ЛЮБОЙ работающий веб-сайт имеет кнопку, принимает пользовательский ввод, а затем переходит на следующую страницу в приложении? Как уже отмечалось, мы должны передать эти критерии поиска на страницу «результаты поиска/отображение».

Таким образом, здесь все потеряно, если мы не можем просто передать некоторые значения на следующую веб-страницу в вопросе - 100% всех приложений требуют этого СУПЕР ПРОСТОГО набора навыков.

Итак, давайте напишем код для ввода данных пользователем, чтобы пользователь нажимал кнопку, а затем переходил на страницу для отображения результатов.

НЕ имеет значения, находятся ли это текстовое поле и кнопка на ЛЮБОЙ веб-странице, и не имеет значения, находятся ли текстовое поле и кнопка на главной странице.

и не имеет значения, находятся ли текстовое поле и кнопка в строке меню на главной странице.

Во всех случаях вопрос остается одним и тем же СУПЕР ПРОСТЫМ вопросом:

Как я могу иметь текстовое поле, и нажатие кнопки показывает результаты поиска этого текстового поля, и нажатие кнопки.

Итак, давайте предположим, что это строка меню - мы можем быть на ЛЮБОЙ странице в приложении - нам все равно, но, что более важно, нам не нужно заботиться !!!

Таким образом, на главной странице этот поиск может быть в строке меню или на главной странице — неважно, неважно.

На самом деле это текстовое поле и поиск могут быть в ЛЮБОМ МЕСТЕ ВСЕГО приложения.

Ведь, как уже отмечалось, САМАЯ простая вещь в веб-приложении это:

У меня есть кнопка, какой-то текст, и мне нужно нажать кнопку, чтобы передать информацию htis на следующую страницу, о которой идет речь!!!!

Итак, давайте добавим это текстовое поле + кнопку поиска на главную страницу.

Так:

    <div style = "float:right">
        <asp:TextBox ID = "txtSearch" runat = "server"></asp:TextBox>
        <asp:Button ID = "cmdSearch" runat = "server" Text = "Search" OnClick = "cmdSearch_Click"
            CssClass = "btn" style = "margin-left:8px"  />
    </div>

Код для вышеуказанной кнопки на главной странице таков:

    protected void cmdSearch_Click(object sender, EventArgs e)
    {
        Session["MyFilter"] = txtSearch.Text;
        Response.Redirect("SearchResult");
    }

Опять же, это то, чем мы все занимаемся весь день — передаем некоторые значения на другую целевую страницу. Мы могли бы использовать queryparms в URL.

А теперь давайте создадим страницу searchResults.aspx. Это может быть сетка результатов.

Итак, скажем, простое gv, подобное этому

<asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" 
    DataKeyNames = "ID"  width = "60%" CssClass = "table table-hover" >
    <Columns>
        <asp:BoundField DataField = "FirstName" HeaderText = "FirstName"  />
        <asp:BoundField DataField = "LastName" HeaderText = "LastName"  />
        <asp:BoundField DataField = "HotelName" HeaderText = "HotelName"  />
        <asp:BoundField DataField = "Description" HeaderText = "Description"  />
        <asp:TemplateField HeaderText = "Active" ItemStyle-HorizontalAlign = "Center">
            <ItemTemplate>
                <asp:CheckBox ID = "chkActive" runat = "server" 
                    Checked='<%# Eval("Active") %>'/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button ID = "cmdView" runat = "server" Text = "View" CssClass = "btn"
                    OnClick = "cmdView_Click" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

И код этой простой страницы с gv "результаты поиска" такой:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["MyFilter"] != null)
            {
                // we have a filter, display the filter results
                string strSQL =
                    @"SELECT * FROM tblHotels WHERE HotelName like '%' + @p1 + '%'
                    AND Description is not null";

                SqlCommand cmdSQL = new SqlCommand(strSQL);
                cmdSQL.Parameters.Add("@p1", SqlDbType.NVarChar).Value = Session["MyFilter"];

                DataTable rstData = MyRstP(cmdSQL);

                GridView1.DataSource = rstData;
                GridView1.DataBind();

                mystext.InnerText = $"Hotel search Results for Hotel =  {Session["MyFilter"].ToString()}";

            }   
        }
    }

И, таким образом, теперь мы можем быть на ЛЮБОЙ странице, ввести поиск и нажать кнопку поиска.

получаем такой эффект:

Как показано выше, не имеет значения, на какой странице или где мы находимся.

простая цель состоит в том, чтобы принять этот ввод и перейти на страницу результатов поиска.

Как я повторял снова и снова, как заезженная пластинка, простой переход на страницу результатов поиска ДЕЙСТВИТЕЛЬНО во многом аналогичен попытке заменить дочернюю страницу на основе текущей страницы, на которой мы находимся.

Таким образом, нет реальной необходимости менять дочернюю страницу, отображаемую в настоящее время на текущей мастер-странице — здесь достаточно простого перехода на страницу для отображения результатов поиска. Итак, если на странице результатов поиска также есть эталонная страница, то мы все должны быть счастливы и теплы.

Редактировать № 4: тогда давайте не будем использовать сеанс, хорошо?

Итак, кнопка на мастер-странице становится такой:

        Response.Redirect("SearchResult");

И теперь на нашей странице результатов поиска у нас есть это:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadData();
    }

    void LoadData()
    {
        // get value from search box in master page.

        TextBox txtSearchBox = (TextBox)Page.Master.FindControl("txtSearch");

        DataTable rstData = new DataTable();
        string strSQL =
            @"SELECT * FROM tblHotelsA WHERE HotelName like '%' + @p1 + '%' ORDER BY HotelName";

        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                cmdSQL.Parameters.Add("@p1", SqlDbType.NVarChar).Value = txtSearchBox.Text;
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        GridView1.DataSource = rstData;
        GridView1.DataBind();
    }

Он все еще работает. Я не думаю, что какое-то беспокойство по поводу "сеанса" вообще меняет эту проблему.

В конце концов, у нас есть текстовое поле и кнопка для поиска. Концепция передачи значений на страницу в asp.net? Боже, каждое приложение, которое я когда-либо писал, делает это все время.

 You can use session to pass the search value
 You can pass the value in the URL (url query parms)

 You can remove the button click, and use postbackurl, and thus
 you can now use "previous" page.

другими словами, мы вернулись к самой простой концепции.

Довольно много «любого» веб-сайта будет иметь множество примеров кода, который принимает некоторый пользовательский ввод, а затем «переходит» на следующую страницу, и передача значений на эту следующую страницу имеет несколько решений — вы можете использовать сеанс, можете использовать URL параметры.

Или, как показано выше, возьмите значение с главной страницы и используйте это значение.

Нет, это противоположно тому, что мне нужно. Вот что я упомянул: так вы получаете доступ к «Мастер-странице» внутри контента или наоборот. Ничто из этого на самом деле не меняет саму «Content-Page». Я думаю, что единственный способ - «Перенаправить» с помощью строки запроса. Я опубликую свой собственный ответ.

Robert Koernke 28.12.2022 17:48

В вашем вопросе говорится: «как изменить содержимое главной страницы». это то, что я опубликовал. Итак, вы имеете в виду, что хотите изменить содержимое главной страницы с дочерней страницы? Термин «контент», к сожалению, имеет два значения, и поэтому: я хочу изменить содержимое дочерней страницы с основной или я хочу изменить содержимое главной страницы с дочерней страницы. Поскольку вы имеете в виду, что дочерняя страница должна изменить главную страницу? Конечно, я обновлю свой пост.

Albert D. Kallal 28.12.2022 18:07

Я хочу изменить буквальную страницу в «Содержимом». Так как имя страницы изменилось. Может быть, следовало сказать «тогда поменяй обратно?» в комментарии выше.

Robert Koernke 28.12.2022 18:12

Нет, это очень просто. Я хочу, чтобы код главной страницы изменил "вещи" дочерней страницы. Или я хочу, чтобы код в дочернем элементе изменил «вещи» главной страницы. Есть только 2 случая. Смотрите мое редактирование, я показываю, как дочерняя страница может изменить «вещи» главной страницы.

Albert D. Kallal 28.12.2022 18:20

Смотрите мою правку №3. Чтобы изменить/заменить эту страницу контента (дочернюю страницу), мы просто используем response.redirect. В любом случае результаты действительно такие же, как и при замене шаблона контента.

Albert D. Kallal 28.12.2022 18:40

Ну, вы показываете результаты поиска, или поиск отправляет пользователя на заданную страницу на основе результатов поиска? Код главной страницы может либо отображать список результатов (в searchResults.aspx), либо извлекать список, либо просто переходить непосредственно на заданную страницу с помощью response.redirect в зависимости от того, что они искали. в обоих этих случаях использования я не вижу причин, по которым процедура поиска эталонной страницы не может отображать результаты поиска или переходить на страницу на основе этого поиска (если это произойдет).

Albert D. Kallal 28.12.2022 22:04
Ответ принят как подходящий

Это единственный способ, которым я верю. Я не думаю, что вы действительно можете изменить буквальное содержание заполнителя с мастер-страницы.

protected void btn_search_Click(object sender, ImageClickEventArgs e)
{
    string pageName = this.ContentPlaceHolder1.Page.GetType().FullName;
    if (pageName != "ASP.chinashipmanagerhome_aspx")
    {
        string t = Base64Encode(tb_search.Text);
        Response.Redirect("ChinaShipManagerHome.aspx?search2 = " + t); //Redirect with query
    }

Потом в 'Page_Load' добавил, предварительно проверив, что человек не потерял сессию. Обновлено: На самом деле не имеет значения, является ли его обратная передача, на самом деле это должно быть и то, и другое.

        else
        {
            if (Request.QueryString["search2"] != null && tb_search.Text == "")
            {
                tb_search.Text = Base64Decode(Request.QueryString["search2"].ToString());
                btn_search_Click(this, new ImageClickEventArgs(1, 1));
            }
        }

Здесь он напоминает «btn_search_click», но теперь находится на правильной странице. Обновлено: необходимо также проверить, что tb_search.Text пуст, иначе при повторном поиске вы получите циклическую ссылку.

Простой ответ. Перенаправление на нужную страницу также должно быть достаточным. Поскольку эта дочерняя страница будет иметь свою главную страницу, то вместо попытки поменять местами страницу, отображаемую внутри некоторого элемента управления содержимым, в любом случае просто выполнить response.redirect на данную дочернюю страницу. В любом случае эффект и результаты на самом деле очень похожи. В этом случае вы не можете найти какой-то пример кода, чтобы делать то, что вы просите, поскольку такого случая на самом деле не существует больше или меньше, чем использование простого response.redirect для достижения той же цели.

Albert D. Kallal 28.12.2022 18:48

В исходной формулировке см. выше: «Однако они могли отклониться от контента, с которым должен взаимодействовать« поиск »». Когда они нажимают btn_search, этот поиск должен взаимодействовать с контентом, но сейчас он не может, потому что они больше не находятся на одной странице. Итак, чтобы решить проблему, как показано в моем «ответе», да, я перенаправляю. Однако простая переадресация отправит их только на «Домашнюю» страницу (без каких-либо результатов...). Вот почему мне нужно также перенаправить информацию, предоставленную, когда они нажали «btn-search». Затем поймайте это снова в Master-Load.

Robert Koernke 01.01.2023 03:26

@AlbertD.Kallal Возможно, то, что вам также нужно было понять. Этот щелчок по Btn_search включал текстовое поле tb_search (как то, что они искали) на Мастере. Эти данные я не включил.

Robert Koernke 01.01.2023 13:40

Я предположил, что окно поиска и код, который выполняется, находятся на главной странице. Тогда я думаю, что делает код для поиска? он ищет какую-то таблицу в базе данных или ему нужно выполнять какие-то операции на множестве различных отображаемых текущих дочерних страниц, или ему все равно? (безразлично, мы ищем, скажем, таблицу базы данных?).

Albert D. Kallal 01.01.2023 15:57

Он заполняет сетки результатов, которые появляются на ChinaShipManagerHome...

Robert Koernke 03.01.2023 15:15

Хорошо, тогда посмотрите мое редактирование № 3 ниже, разве это не тот эффект и цель, которую вы ищете ???

Albert D. Kallal 03.01.2023 18:31

Ваш Edit-3 редактировался несколько раз, да, я мог бы использовать переменную сеанса для выполнения той же задачи. Оригинальный Edit-3 не выглядел так. Я удалил один из моих комментариев, который больше не применяется ниже.

Robert Koernke 03.01.2023 20:28

но почему использование сеанса имеет значение, или захват текстового поля из мастера, или передача значений с использованием параметров URL? См. мое редактирование № 4, в котором я не использую сеанс. Сессия на самом деле не очень важна здесь, но ЧТО важно, так это то, что я до сих пор не вижу хорошего повествования, которое требует замены текущей дочерней страницы с главной, когда простая простая навигация Джейн достигает той же цели и результата.

Albert D. Kallal 03.01.2023 21:20

@AlbertD.Kallal Вы видели мой ответ выше. Действительно ли он меняет дочернюю страницу? Он делает то же самое, что и ваш Edited (Edit # 3), за исключением запроса вместо сеанса. Исходный вопрос на самом деле спрашивал, как «заменить текущую дочернюю страницу». Ответ, который я дал, делает это с помощью «перенаправления». Ты тоже... отдохни.

Robert Koernke 03.01.2023 21:36

Ах, хорошо, тогда мы на 100% уверены, что нет необходимости менять страницу, и что мое оригинальное предложение и ответ на простую навигацию — это путь, о котором я говорил все это время. Итак, я в растерянности для всех ваших дополнительных вопросов. Простой, ах да, я вижу, что не было необходимости менять дочернюю страницу, и старая добрая простая Джейн и простая навигация прекрасны и денди, и то, что я предлагаю, было, таким образом, решением здесь - и в значительной степени решением, которое вы усыновленный. Другими словами, мое простое предложение всегда было простым ответом, верно? Так почему тогда все ваши вопросы в комментариях?

Albert D. Kallal 03.01.2023 21:39

Давайте продолжим обсуждение в чате.

Robert Koernke 03.01.2023 21:40

Не надо продолжать дискуссию. Я просто разместил немного кода, и вы ответили с цитатой: «Я мог бы использовать переменную сеанса». Хорошо, тогда вы возражаете против этого кода, и поэтому я просто отправил сообщение снова, не используя сеанс. (как если бы session() была большой проблемой и поводом для жалоб). Итак, что еще нам нужно обсудить, или есть что-то еще, что вы «просто не можете здесь отпустить???»

Albert D. Kallal 03.01.2023 22:01

Другие вопросы по теме