Феномен WebControl.ID
От: _SM_ Украина  
Дата: 04.09.05 12:22
Оценка:
Привет, коллеги!
Наткнулся на грабли.
У кого есть идеи хотя бы о причинах такого явления?


На форме:

<asp:Label ID="ID" Runat="server">123</asp:Label>


Ответ парсера:

The base class includes the field 'ID', but its type (System.String) is not
compatible with the type of control (System.Web.UI.WebControls.Label).

Если же указать ID="ID1", то все работает.
Использую .NET Framework 1.1

04.09.05 23:18: Перенесено модератором из '.NET' — AndrewVK
Феномен WebControl.ID
От: Аноним  
Дата: 04.09.05 17:04
Оценка:
Очень просто, у любого контрола есть ID, который храниться в соответствующем свойстве класса. Т.к. в классе формы уже есть свойство ID, попытка создать свойство с таким же именем (что и происходит при добавлении контрола с ID="ID", т.к. контролы — фактически тоже являются свойствами класса формы) не проходит.
--
VBStreets, Editor-in-Chief
http://blogs.gotdotnet.ru/personal/gaidar/

What is a rigorous definition of rigor?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Феномен WebControl.ID
От: egaron http://127.0.0.1
Дата: 05.09.05 09:15
Оценка:
Здравствуйте, _SM_, Вы писали:
_SM>Ответ парсера:

_SM> The base class includes the field 'ID', but its type (System.String) is not

_SM> compatible with the type of control (System.Web.UI.WebControls.Label).


Обычно такое сообщение вылетает, когда не совпадает класс объявленного контрола в форме и код-бехайнде.
Re: Феномен WebControl.ID
От: mogadanez Чехия  
Дата: 05.09.05 09:38
Оценка:
Здравствуйте, gaidar, Вы писали:

G>Очень просто, у любого контрола есть ID, который храниться в соответствующем свойстве класса. Т.к. в классе формы уже есть свойство ID, попытка создать свойство с таким же именем (что и происходит при добавлении контрола с ID="ID", т.к. контролы — фактически тоже являются свойствами класса формы) не проходит.


ты не прав. форма тут не причем.

во первых Label не является "формовым" элементом.
во вторых Label может не лежать внутри формы, а быть не посредсвенно на странице.
ты вполне можешь написать
  <asp:Label Runat = server ID ="ID"/>    
    <form id="Form1" method="post" runat="server">
     </form>

либо даже вообще выкинуть форму.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: Феномен WebControl.ID
От: Козьма Прутков Россия  
Дата: 05.09.05 09:39
Оценка: +1
О, до меня похоже дошло что происходит. Парсер анализирует значение свойства id и выясняет, что поле с таким именем ("ID") есть в классе кодбихайнда (id принадлежит базовому классу Control, от которого в том числе наследует и страница; так ищется поле, являющееся ссылкой на контрол в странице). Но оно имеет тип не контрола, а string. Соответственно, парсер не может допустить подобного присваивания и кидает ошибку.
Забавный эффект
Posted via RSDN NNTP Server 1.9
Да хранит вас господь в сухом прохладном месте...
Re[2]: Феномен WebControl.ID
От: mogadanez Чехия  
Дата: 05.09.05 10:37
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

КП>О, до меня похоже дошло что происходит. Парсер анализирует значение свойства id и выясняет, что поле с таким именем ("ID") есть в классе кодбихайнда (id принадлежит базовому классу Control, от которого в том числе наследует и страница; так ищется поле, являющееся ссылкой на контрол в странице). Но оно имеет тип не контрола, а string. Соответственно, парсер не может допустить подобного присваивания и кидает ошибку.

КП>Забавный эффект

но есть еще странность, если дать ей айдишник вроде "Visible" или "Controls", то работает, хотя поля с такими именами тоже есть =))
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[3]: Феномен WebControl.ID
От: Козьма Прутков Россия  
Дата: 05.09.05 11:18
Оценка: 18 (1)
> но есть еще странность, если дать ей айдишник вроде "Visible" или "Controls", то работает, хотя поля с такими именами тоже есть =))
Я пробовал ставить Visible — эффект тот же.
На самом деле есть такое наблюдение: если ты делаешь это в дизайнере (то есть не руками aspx правишь) то дизайнер добавляет в кодбихайнд соответствующее поле и все работает. А ты поле удали и попробуй

The base class includes the field 'Visible', but its type (System.Boolean) is not compatible with the type of control (System.Web.UI.WebControls.Label).


Однако, насчет Controls ты прав: такой ID проходит нормально. Дело за немногим — найти рефлектором кусок кода, котрый это делает, и его изучить Вот ответ на это противоречие:
private void BuildFieldDeclaration(ControlBuilder builder, bool fGeneratedID)
{
      if (this._baseClassType != null)
      {
            Type type1 = Util.GetNonPrivateFieldType(this._baseClassType, builder.ID);
            if (type1 == null)
            {
                  type1 = Util.GetNonPrivatePropertyType(this._baseClassType, builder.ID);
            }
            if (type1 != null)
            {
                  if (!type1.IsAssignableFrom(builder.ControlType))
                  {
                        throw new HttpParseException(HttpRuntime.FormatResourceString("Base_class_field_with_type_different_from_type_of_control", builder.ID, type1.FullName, builder.ControlType.FullName), null, builder.SourceFileName, null, builder.Line);
                  }
                  return;
            }
      }
    //skipped
}

internal static Type GetNonPrivateFieldType(Type classType, string fieldName)
{
      FieldInfo info1 = classType.GetField(fieldName, BindingFlags.NonPublic | (BindingFlags.Public | (BindingFlags.Static | (BindingFlags.Instance | BindingFlags.IgnoreCase))));
      if ((info1 != null) && !info1.IsPrivate)
      {
            return info1.FieldType;
      }
      return null;
}
internal static Type GetNonPrivatePropertyType(Type classType, string propName)
{
      PropertyInfo info1 = classType.GetProperty(propName, BindingFlags.NonPublic | (BindingFlags.Public | (BindingFlags.Static | (BindingFlags.Instance | BindingFlags.IgnoreCase))));
      if (info1 != null)
      {

            MethodInfo info2 = info1.GetSetMethod(true);
            if ((info2 != null) && !info2.IsPrivate)
            {
                  return info1.PropertyType;
            }

      }
      return null;
}


То есть ищется неприватное поле или не-readonly свойство и дальше сверяются типы и прочее. А свойство Controls — readonly, так что эта штука его не находит (точнее, не рассматривает), ничему не присваивает ссылку на контрол и спокойно добавляет контрол в коллекцию с ID="Controls".
Ну вот, гармония вернулась в мир (с) Масяня
Posted via RSDN NNTP Server 1.9
Да хранит вас господь в сухом прохладном месте...
Re[4]: Феномен WebControl.ID
От: mogadanez Чехия  
Дата: 05.09.05 11:36
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

>> но есть еще странность, если дать ей айдишник вроде "Visible" или "Controls", то работает, хотя поля с такими именами тоже есть =))

КП>Я пробовал ставить Visible — эффект тот же.
КП>На самом деле есть такое наблюдение: если ты делаешь это в дизайнере (то есть не руками aspx правишь) то дизайнер добавляет в кодбихайнд соответствующее поле и все работает. А ты поле удали и попробуй

да ты прав, Visible тоже не работает
не знаю в чем был глюк, но не в дизайнере, я им уже года полтора не пользовался вообще.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.