Tipton Tyler Ответов: 2

Передача значения в url-запрос


Я пытаюсь найти решение проблемы, с которой я сталкиваюсь, передавая значение одной форме " SongsByBand "в другую форму в моем проекте"ViewDetails". "SongsByBands" - это, по сути, список групп, в котором каждая песня, исполняемая этой группой, представлена в пуленепробиваемом списке. Я хочу каким-то образом перейти от одной песни в маркированном списке к форме "ViewDetails"; ViewDetails принимает идентификатор песни для доступа к дополнительной информации об этой конкретной песне. Песни и группы содержатся в отдельных таблицах базы данных SQL Server, и Entity Framework используется для доступа к полям из каждой таблицы.

Соответствующий код в форме "SongsByBand" следует:

&ЛТ;АСП:контента ID="Content2" атрибутом ContentPlaceHolderID="cpMainContent" атрибут runat="сервер"и GT;
<asp:EntityDataSource ID= "EntityDataSource1" runat= "сервер">
< / asp:EntityDataSource>
<asp: Repeater ID= "Repeater1" runat= "server" >
& lt;ItemTemplate>
&ЛТ;Н3&ГТ; &ЛТ;АСП:литерал идентификатор="Literal1" атрибут runat="сервер"
Текст=в'<%# Ивала("Band1")%&ГТ;'&ГТ;&ЛТ;/АСП:литерал&ГТ;&ЛТ;/Н3&ГТ;
&ЛТ;Н4&ГТ; &ЛТ;АСП:литерал идентификатор="Literal2" атрибут runat="сервер"
Текст=в'<%# Ивала("Записки")%&ГТ;'&ГТ;&ЛТ;/АСП:литерал&ГТ;&ЛТ;/Н4&ГТ;
<asp: BulletedList ID=" SongList "runat= "server" DisplayMode= " LinkButton"
DataSource = '<%# Eval ("Songs") % & gt;' DataTextField= " Title"
DataValueField= "Id">
< / asp:BulletedList>
< / ItemTemplate>
< / asp: ретранслятор>
< / asp: содержание>


С сопроводительным кодом позади:

public partial class Songs_SongsByBand : BasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
      using (TRTDevelopmentSongsAndBandsEntities myEntities = 
             new TRTDevelopmentSongsAndBandsEntities())
      {
        var AllSongs = from Band in myEntities.Bands.Include("Songs")
                       orderby Band.Band1
                       select new { Band.Band1, Band.Notes, Band.Songs };
        Repeater1.DataSource = AllSongs.ToList();
        Repeater1.DataBind();
      }
    }
}

[NB: я опустил утверждения "using".]

Соответствующий код в форме "ViewDetails" снова следует:
<asp:Content ID="Content2" ContentPlaceHolderID="cpMainContent" Runat="Server">
  <h1><asp:Label ID="TitleLabel1" runat="server" ></asp:Label></h1><br />
  <asp:Label ID="BandLabel1" runat="server" ></asp:Label><br />
  <asp:Label ID="SongWriterLabel1" runat="server" ></asp:Label><br />
  <asp:Label CssClass="Comments" ID="CommentsLabel1" runat="server"></asp:Label>
  <br />
    <asp:HyperLink ID="HyperLink2" runat="server" >For Song Clip, Click Here
    </asp:HyperLink>
    <br/>
  </asp:Content>


Со следующим кодом позади:

общественные частичная
класс Songs_ViewDetails : BasePage
{
protected void Page_Load(отправитель объекта, EventArgs e)
{
int songId = конвертировать.ToInt32 (Запрос.QueryString. Get ("SongId"));
использование(TRTDevelopmentSongsAndBandsEntities
myEntities = новые TRTDevelopmentSongsAndBandsEntities())

mySong = (от r в myEntities.Песни.Include ("Группа")
где r.Id = = songId
выберите r).Метода singleordefault();
если (mySong != null)
{
TitleLabel1.Text = "Title: -" + mySong.Заглавие;
BandLabel1.Text = "группа / певец: -" + mySong.Band.Band1;
SongWriterLabel1.Text = "автор песен: -" + mySong.песенник;
CommentsLabel1.Text = "комментарии: -" + mySong.Комментарии;
HyperLink2.Navigateurl свойство = mySong.ClipLink;
HyperLink2.Привязку();
Название = mySong.Заглавие;
MetaDescription = mySong.Комментарии;
}
}
}

Что я уже пробовал:

Я работал над этим в течение нескольких дней и попробовал несколько подходов, чтобы захватить "SongId" и передать его в форму" ViewDetails".:

Я попытался, используя гиперссылку в "маркированный список", используя navigateurl свойство с вариациями следующий синтаксис:

NavigateUrl='<%# " ViewDetails?SongId= " + Item. Id. ToString () %>'

Но код не распознает предмет, идентификатор или что-то вроде Песни.Удостоверение личности или любая другая форма, которую я могу придумать.

Как вы можете заметить, я вставил DataValueField= " Id " и подтвердил, что полученный идентификатор является соответствующим SongId. Очень неприятно видеть значение, но не найти способа передать его в форму" ViewDetails".

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

Sinisa Hajnal

Как вы связываете другие свойства? т. е. если вы используете Item.BandName, то же самое должно работать и для Item.Id обратите внимание, что это означает, что ваше поле Id содержит songId, а не bandId или какое-либо другое значение Id.

Я не уверен, что понимаю проблему. Это из-за того, что Id не записывается в параметр SongId или что ваш DetailsView не может видеть/анализировать этот параметр?

Tipton Tyler

Спасибо за Ваш быстрый ответ. Я не думаю,что проблема в привязке. Я могу создать маркированный список, в котором перечислены названия песен, используя:

DataSource = '<%# Eval ("Songs") % & gt;' DataTextField= " Title"

и маркированный список, в котором указан соответствующий идентификатор песни с помощью:

Источник данных = в '<%# Ивала("песни") %&ГТ;' DataValueField="идентификатор"

NB[каким-то образом часть кода для форм "Songs and Bands" была удалена из вопроса и выглядит так:

&ЛТ;АСП:контента ID="Content2" атрибутом ContentPlaceHolderID="cpMainContent" атрибут runat="сервер"и GT;
<asp:EntityDataSource ID= "EntityDataSource1" runat= "сервер">

<asp: Repeater ID= "Repeater1" runat= "server" >





Я считаю, что моя проблема заключается в структуре; я не знаю, как захватить идентификатор песни и вставить его в гиперссылку в маркированном списке.

2 Ответов

Рейтинг:
2

#realJSOP

Я не вижу места, где вы сидите Item к значению. Может быть, вам нужно использовать mySong.Id вместо этого?


Tipton Tyler

Я не совсем уверен, где мне нужно добавить "пункт". Однако вот некоторые вещи, которые я попробовал после добавления тега NavigateUrl в " BulletedList"
1) NavigateUrl= '%# " ViewDetails?SongId= " + Songs. Id. ToString ()%'
// Songs не существует в текущем контексте.
Майсон.Id. ToString () //mySong не существует в текущем контексте.
Song.Id / / для нестатидного поля, метода или свойства 'Song.Id.Get'требуется референция объекта
Song.Id / / для нестатидного поля, метода или свойства 'Song.Id.Get'требуется референция объекта
Значение% / / значение имени не существует в текущем контексте. (Я думал, что это может получить значение из "BulletedList" "DataValueField", но, очевидно, это не так)
Мне не повезло использовать вторую
NavigateUrl= '%# " ViewDetails?SongId= " + Eval ("Id")%' / / System.Web.HttpException: DataBinding: не содержит свойства с именем 'Id'.
Эвал("mySong.Id")%' / / System.Web.HttpException: DataBinding: не содержит свойства с именем 'mySong'.
Эвал("Song.Id")%> / / System.Web.HttpException: DataBinding: не содержит свойства с именем 'Song'.
Я начинаю верить, что мне нужен совершенно новый подход, но я действительно не знаю, с чего начать. На самом деле не так уж трудно программно вставить значение в "NavigateUrl".

[NB: мне пришлось удалить все теги, потому что текстовый редактор, похоже, интерпретирует их как конечные маркеры.]

#realJSOP

избежать их можно с помощью & lt; и & gt;

Рейтинг:
2

Tipton Tyler

Вопрос решен. В том маловероятном случае, если у кого-то есть подобная проблема, вот как я ее решил. Я предполагаю, что есть и другие подходы, которые, вероятно, еще лучше, но это сработало.

Да, мне нужен был новый подход. Я избавился от" пулевого списка " и просто пошел с ретранслятором. Затем я поместил гиперссылку в шаблон внутри тега ретранслятора. Наконец, я добавил CSS-класс к гиперссылке (в<предварительно>У CssClass="HyperLinkBullet" &ЛТ;/подготовка и GT;) и по сути форматирование маркированного списка в таблице стилей CSS, в сущности, вот соответствующий код:

Ланг="текст"&ГТ;&ЛТ;заранее Ланг="HTML"и&ГТ;&ЛТ;АСП:репитер идентификатор="BandRepeater" атрибут runat="сервер"и GT;
& amp;lt;HeaderTemplate>
&ЛТ;п&ГТ;ниже вы найдете список песен для каждого из ваших любимых групп.&ЛТ;/п&ГТ;
& lt; / HeaderTemplate>
& lt;ItemTemplate>
< h3>
&ЛТ;АСП:литерал идентификатор="Literal1" атрибут runat="сервер" текст=в'<%# Ивала("Band1") %&ГТ;'&ГТ;&ЛТ;/АСП:литерал&ГТ;
< / h3>
< h4>
&ЛТ;АСП:литерал идентификатор="Literal2" атрибут runat="сервер" текст=в'<%# Ивала("Записки") %&ГТ;'&ГТ;&ЛТ;/АСП:литерал&ГТ;
< / h4>
&ЛТ;АСП:репитер идентификатор="SongRepeater" атрибут runat="сервер" Пункттип="песня" источника данных=в'<%# Ивала("песни") %&ГТ; в'>
& lt;ItemTemplate>
&ЛТ;АСП:гиперссылку с ID="HyperLink1" CssClass="HyperLinkBullet" атрибут runat="сервер" текст=в'<%# дет.Название %>'
NavigateUrl='<%# " ViewDetails?SongId=" + Товар.ИД.Метод toString() %&ГТ; в'>
< / asp: гиперссылка> & lt; br / & gt;
< / ItemTemplate>
< / asp: ретранслятор>
< / ItemTemplate>
< / asp: ретранслятор>

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

< pre lang= "текст">.HyperLinkBullet

{
дисплей: список-элемент;
список-стиль-тип: диск;
маржа-топ: 10px
}< / pre>


Vincent Maverick Durano

Не могли бы вы отформатировать свой код, чтобы сделать его более читабельным и дружелюбным для будущих читателей? Спасибо.