Почему я не могу связать свойство в .aspx, когда это возможно в .xaml - PullRequest
1 голос
/ 01 августа 2011

Ошибка, которую я получаю:

Имя 'strTitle' (имя свойства) не существует в текущем контексте

Для ясности покажу код:

Silverlight:

  var myData =from xAudioinfo in xResponse.Descendants(ns + "DIDL-Lite").Elements(ns + "item")
  select new RMSMedia 
                      {
                         strTitle =((string)xFolderInfo.Element(dc + "title")).Trim(),                                                  
                         objectID = (int)xFolderInfo.Attribute("id")
                      };

Теперь я могу связать это в моем XAML, как показано ниже:

<TextBlock Text ="{Binding strTitle}" />

Но это не работает в ASP.NET.

ASP.NET

 var myData =from xAudioinfo in xResponse.Descendants(ns + "DIDL-Lite").Elements(ns + "item")
  select new RMSMedia 
                      {
                         strTitle =((string)xFolderInfo.Element(dc + "title")).Trim(),                                                  
                         objectID = (int)xFolderInfo.Attribute("id")
                      };

Попытка связать с HTML Control:

<asp:Label ID="lbWindCondition" runat="server" Text=<%#strTitle %>></asp:Label>

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

Моя структура кода выглядит следующим образом:

public class currentWeatherCondition
        {
            public string condition { get; set; }
            public string temp { get; set; }
            public string imageURL { get; set; }
            public string humidity { get; set; }
            public string windCondition { get; set; }
         }

public partial class _Default : System.Web.UI.Page 
{
   protected void btnGetDetails_Click(object sender, EventArgs e)
    {
        try
        {
            var weatherXML = XDocument.Load(weatherURL);
            var weatherResult = from weatherDetail in weatherXML.Descendants("current_conditions")
                                select new currentWeatherCondition
                                {
                                    condition = ((string)weatherDetail.Element("condition").Attribute("data")).Trim(),
                                    temp = ((string)weatherDetail.Element("temp_c").Attribute("data")).Trim(),
                                    imageURL = ((string)weatherDetail.Element("icon").Attribute("data")).Trim(),
                                    humidity = ((string)weatherDetail.Element("humidity").Attribute("data")).Trim(),
                                    windCondition = ((string)weatherDetail.Element("wind_condition").Attribute("data")).Trim(),

                                };
            }
    catch(..)
      {
           ......
       }
}

Значит, мы имеем в виду, что я буду непосредственно создавать prpoerty в классе _Default или создавать объект currentWeatherCondition в классе по умолчанию, а затем связывать / отображать его для элемента управления.

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Мне бы пришлось увидеть остальную часть вашего кода, но я бы предположил, что значение "strTitle" существует исключительно в рамках блока RMSMedia. Вы должны (затем) выставить это значение как публичную собственность одним из четырех способов:

  1. Из публичной собственности страницы.
  2. Из открытого свойства объекта RMSMedia.
  3. Напишите функцию привязки данных для контейнера.
  4. Установить значение напрямую

На всякий случай, если вы не знаете, что это значит ...

(1) От публичной собственности страницы.

public String Title { get; set; }

Затем установите для strTitle заголовок и <% = заголовок%>.

(2) Из публичной собственности объекта RMSMedia.

Затем установите myData.strTitle таким образом <% = myData.strTitle%>.

(3) Написать функцию привязки данных для контейнера.

myContainer.DataBinding += new EventHandler(myContainer_DataBinding);

protected void myContainer_DataBinding(object sender, EventArgs e)
{
     myContainer.DataSource = myData.strTitle;
}

Для вызова последнего вы должны использовать следующее: myContainer.DataBind();

(4) Установите значение непосредственно в вашей функции

lbWindCondition.Text = myData.strTitle;

UPDATE:
Есть куча вариантов, так что на самом деле, вы просто выбираете один. Несмотря на то, что это не имеет никакого отношения к рассматриваемому элементу управления, я добавил третий, приведенный выше, просто как «дополнительный», чтобы показать другие способы привязки в ASP.NET. Четвертый вариант - самый очевидный ответ, хотя , потому что вы устанавливаете значение Text напрямую (т.е. без косвенного обращения).

Значит, мы имеем в виду, что я создам свойство непосредственно в классе _Default?
Да ... если вам нравится этот вариант.

<asp:Label ID="lbWindCondition" runat="server" Text=<%=Title %>></asp:Label>

Или мы создаем объект currentWeatherCondition в классе по умолчанию, а затем в элемент управления?
Да ... если вам нравится этот вариант.

<asp:Label ID="lbWindCondition" runat="server" Text=<%#currentWeatherCondition.YourProperty %>></asp:Label>

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

Наконец, ни один из ответов, приведенных выше, на самом деле не обсуждает, какой вариант является ПРАВИЛЬНЫМ. Честно говоря, каждый раз, когда вы используете операторы косвенного обращения (<%%>), вы используете позднее связывание (что плохо ). Теперь люди скажут вам, что ASP.NET (сейчас) оптимизирован для позднего связывания, так что все в порядке ... но, очевидно, это все еще позднее связывание ... поэтому, если вы "можете" сделать это, установите значение напрямую или используйте данные опция связывания.

Надеюсь, это поможет!

1 голос
/ 01 августа 2011

Метка ASP.NET Control не имеет свойства DataSource, поэтому его невозможно напрямую связать с анонимным объектом. Что вам нужно сделать, это

1) Создайте свойство контейнера страницы, которое будет содержать коллекцию myData 2) Привязать ярлык к этому свойству. =>

Text = '<%# DataBinder.Eval(ContainerObject, "strTitle"); %>'

Я надеюсь, что это поможет:)

...