Я видел обратное, когда кодерам нужно изменить главную страницу для определенного контента. Но в данном случае меня больше беспокоит содержание, и я хочу его изменить.
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 ChinaShipManagerHome — страница по умолчанию. Однако они могут щелкать и делать что-то на других страницах, а основная страница остается (что вполне нормально). Много страниц, один Мастер, верно? Тем не менее, было бы неплохо нажать поиск еще раз. Я начинаю задаваться вопросом, что это может быть невозможно. По крайней мере так, как я просил. Мне может понадобиться «перенаправить» строку поиска в запросе на «ChinaShipManagerhome». Это может быть единственным ответом.
Я знаю, как работают эталонные страницы, поскольку пользуюсь веб-формами уже 13 лет. Я не понимаю, что может помешать им снова щелкнуть поиск после того, как они ранее посещали результаты поиска. Что их останавливает?
Однако ничто их не останавливает: как он покажет результаты, если страница ContentPlaceHolder1 изменилась? Результаты поиска попадают только в сетку, которая появляется здесь: 'ChinaShipManagerHome'. В настоящее время кнопка поиска просто отправляет их домой.
Какая сетка? В вашем вопросе нет сетки. Нам не хватает необходимого контекста о том, как вы реализовали эту функцию поиска, чтобы дать разумную рекомендацию о дальнейших действиях.
я не просил каких-либо рекомендаций для sae. Я просто спросил: «Как изменить страницу содержимого из мастер-страницы в ASP.NET с помощью C#?». И я показал, где именно в коде я хотел это вставить. Ты мог сказать мне, что я не могу этого сделать. Думаю, я опубликую ответ о том, что я буду делать. Потому что я думаю, что ответ на самом деле таков: я не могу делать то, что прошу. Но способ решить это - перенаправление со строкой запроса - единственный способ.
Это хороший пример задачи XY. Я знаю, что вы не спрашивали рекомендаций о том, как это изменить, но на самом деле звучит так, как будто то, что вы пытаетесь сделать (Y), не имеет смысла с точки зрения дизайна, поэтому лучше знать, каков ваш контекст ( X) может помочь нам лучше помочь вам.





Это должно работать:
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>© <%: 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";
}
Во многих случаях я скажу, что пользователи переходят на страницу, но это НЕ та страница, которую я хочу.
Например, у меня есть страница проекта, и мы можем попасть на эту страницу ТОЛЬКО из 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 должно быть достаточно, чтобы «изменить», какую дочернюю страницу мы должны отображать.
Как я уже неоднократно говорил, нам действительно НЕ важно, ГДЕ поиск и кнопка.
Вопрос НА САМОМ ДЕЛЕ таков:
У меня есть текстовое поле и кнопка. Пользователь введет некоторые критерии поиска и нажмет кнопку. Затем я хочу перейти на страницу для отображения результатов поиска.
На самом деле, это САМЫЙ основной вопрос веб-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()}";
}
}
}
И, таким образом, теперь мы можем быть на ЛЮБОЙ странице, ввести поиск и нажать кнопку поиска.
получаем такой эффект:
Как показано выше, не имеет значения, на какой странице или где мы находимся.
простая цель состоит в том, чтобы принять этот ввод и перейти на страницу результатов поиска.
Как я повторял снова и снова, как заезженная пластинка, простой переход на страницу результатов поиска ДЕЙСТВИТЕЛЬНО во многом аналогичен попытке заменить дочернюю страницу на основе текущей страницы, на которой мы находимся.
Таким образом, нет реальной необходимости менять дочернюю страницу, отображаемую в настоящее время на текущей мастер-странице — здесь достаточно простого перехода на страницу для отображения результатов поиска. Итак, если на странице результатов поиска также есть эталонная страница, то мы все должны быть счастливы и теплы.
Итак, кнопка на мастер-странице становится такой:
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». Я думаю, что единственный способ - «Перенаправить» с помощью строки запроса. Я опубликую свой собственный ответ.
В вашем вопросе говорится: «как изменить содержимое главной страницы». это то, что я опубликовал. Итак, вы имеете в виду, что хотите изменить содержимое главной страницы с дочерней страницы? Термин «контент», к сожалению, имеет два значения, и поэтому: я хочу изменить содержимое дочерней страницы с основной или я хочу изменить содержимое главной страницы с дочерней страницы. Поскольку вы имеете в виду, что дочерняя страница должна изменить главную страницу? Конечно, я обновлю свой пост.
Я хочу изменить буквальную страницу в «Содержимом». Так как имя страницы изменилось. Может быть, следовало сказать «тогда поменяй обратно?» в комментарии выше.
Нет, это очень просто. Я хочу, чтобы код главной страницы изменил "вещи" дочерней страницы. Или я хочу, чтобы код в дочернем элементе изменил «вещи» главной страницы. Есть только 2 случая. Смотрите мое редактирование, я показываю, как дочерняя страница может изменить «вещи» главной страницы.
Смотрите мою правку №3. Чтобы изменить/заменить эту страницу контента (дочернюю страницу), мы просто используем response.redirect. В любом случае результаты действительно такие же, как и при замене шаблона контента.
Ну, вы показываете результаты поиска, или поиск отправляет пользователя на заданную страницу на основе результатов поиска? Код главной страницы может либо отображать список результатов (в searchResults.aspx), либо извлекать список, либо просто переходить непосредственно на заданную страницу с помощью response.redirect в зависимости от того, что они искали. в обоих этих случаях использования я не вижу причин, по которым процедура поиска эталонной страницы не может отображать результаты поиска или переходить на страницу на основе этого поиска (если это произойдет).
Это единственный способ, которым я верю. Я не думаю, что вы действительно можете изменить буквальное содержание заполнителя с мастер-страницы.
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 для достижения той же цели.
В исходной формулировке см. выше: «Однако они могли отклониться от контента, с которым должен взаимодействовать« поиск »». Когда они нажимают btn_search, этот поиск должен взаимодействовать с контентом, но сейчас он не может, потому что они больше не находятся на одной странице. Итак, чтобы решить проблему, как показано в моем «ответе», да, я перенаправляю. Однако простая переадресация отправит их только на «Домашнюю» страницу (без каких-либо результатов...). Вот почему мне нужно также перенаправить информацию, предоставленную, когда они нажали «btn-search». Затем поймайте это снова в Master-Load.
@AlbertD.Kallal Возможно, то, что вам также нужно было понять. Этот щелчок по Btn_search включал текстовое поле tb_search (как то, что они искали) на Мастере. Эти данные я не включил.
Я предположил, что окно поиска и код, который выполняется, находятся на главной странице. Тогда я думаю, что делает код для поиска? он ищет какую-то таблицу в базе данных или ему нужно выполнять какие-то операции на множестве различных отображаемых текущих дочерних страниц, или ему все равно? (безразлично, мы ищем, скажем, таблицу базы данных?).
Он заполняет сетки результатов, которые появляются на ChinaShipManagerHome...
Хорошо, тогда посмотрите мое редактирование № 3 ниже, разве это не тот эффект и цель, которую вы ищете ???
Ваш Edit-3 редактировался несколько раз, да, я мог бы использовать переменную сеанса для выполнения той же задачи. Оригинальный Edit-3 не выглядел так. Я удалил один из моих комментариев, который больше не применяется ниже.
но почему использование сеанса имеет значение, или захват текстового поля из мастера, или передача значений с использованием параметров URL? См. мое редактирование № 4, в котором я не использую сеанс. Сессия на самом деле не очень важна здесь, но ЧТО важно, так это то, что я до сих пор не вижу хорошего повествования, которое требует замены текущей дочерней страницы с главной, когда простая простая навигация Джейн достигает той же цели и результата.
@AlbertD.Kallal Вы видели мой ответ выше. Действительно ли он меняет дочернюю страницу? Он делает то же самое, что и ваш Edited (Edit # 3), за исключением запроса вместо сеанса. Исходный вопрос на самом деле спрашивал, как «заменить текущую дочернюю страницу». Ответ, который я дал, делает это с помощью «перенаправления». Ты тоже... отдохни.
Ах, хорошо, тогда мы на 100% уверены, что нет необходимости менять страницу, и что мое оригинальное предложение и ответ на простую навигацию — это путь, о котором я говорил все это время. Итак, я в растерянности для всех ваших дополнительных вопросов. Простой, ах да, я вижу, что не было необходимости менять дочернюю страницу, и старая добрая простая Джейн и простая навигация прекрасны и денди, и то, что я предлагаю, было, таким образом, решением здесь - и в значительной степени решением, которое вы усыновленный. Другими словами, мое простое предложение всегда было простым ответом, верно? Так почему тогда все ваши вопросы в комментариях?
Давайте продолжим обсуждение в чате.
Не надо продолжать дискуссию. Я просто разместил немного кода, и вы ответили с цитатой: «Я мог бы использовать переменную сеанса». Хорошо, тогда вы возражаете против этого кода, и поэтому я просто отправил сообщение снова, не используя сеанс. (как если бы session() была большой проблемой и поводом для жалоб). Итак, что еще нам нужно обсудить, или есть что-то еще, что вы «просто не можете здесь отпустить???»
Что вы имеете в виду, "они, возможно, отклонились от содержания"?