Как я могу использовать традиционный идентификационный атрибут HTML с ASP.net runat ='server' тег?

Вот код для облачного запроса firebase сервера от C # / Asp.net. Обратите внимание, что ваша клиентская сторона должна иметь одну и ту же тему. например,

FirebaseMessaging.getInstance().subscribeToTopic("news");

public String SendNotificationFromFirebaseCloud()
{
    var result = "-1";
    var webAddr = "https://fcm.googleapis.com/fcm/send";

    var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Headers.Add("Authorization:key=" + YOUR_FIREBASE_SERVER_KEY);
    httpWebRequest.Method = "POST";

    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    {
        string json = "{\"to\": \"/topics/news\",\"data\": {\"message\": \"This is a Firebase Cloud Messaging Topic Message!\",}}";


        streamWriter.Write(json);
        streamWriter.Flush();
    }

    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        result = streamReader.ReadToEnd();
    }

    return result;
}
7
задан ketan 16 December 2015 в 05:28
поделиться

15 ответов

Используйте jQuery для выбора элемента:

$("span[id$='position_title']")....

гибкие селекторы jQuery, особенно 'начинается' с/'ends с селекторами' ('конец с' селектором показывают выше, обеспечьте отличный способ вокруг dom идентификатора ASP.NET munge.

RP

6
ответ дан 6 December 2019 в 19:45
поделиться

Если Вы получаете доступ span или независимо от того, что тег дает Вам проблемы от C# или кода VB позади, затем runat="server" должен остаться и необходимо использовать вместо этого <span class="some_class" id="someID">. Если Вы не получаете доступ к тегу в коде позади, то удаляете runat="server".

0
ответ дан 6 December 2019 в 19:45
поделиться

Я уверен, что это спросили здесь по крайней мере однажды. Термин 'портит'. Rich Strahl записал сообщение об этом в 2006 также.

0
ответ дан 6 December 2019 в 19:45
поделиться

Я обычно делаю свое собственное управление, которое расширяет WebControl или HtmlGenericControl, и я переопределяю ClientID - возврат свойства ID вместо сгенерированного ClientID. Это вызовет любое преобразование, которое.NET делает к ClientID из-за именованных контейнеров, которые вернутся назад к исходному идентификатору, который Вы указали в разметке тега. Здорово, если Вы пользуетесь клиентскими библиотеками как jQuery и нуждаетесь в предсказуемых уникальных идентификаторах, но жесткий при доверии состоянию отображения для чего-нибудь серверная сторона.

0
ответ дан 6 December 2019 в 19:45
поделиться

Существует ли конкретная причина, что Вы хотите, чтобы средства управления были runat = "сервер"?

Если так, я второй использование <asp: Литерал>...

Это должно сделать задание для Вас, поскольку Вы все еще сможете отредактировать данные в коде позади.

0
ответ дан 6 December 2019 в 19:45
поделиться

Если Вы боитесь classitus, попытайтесь использовать идентификатор на родительском или дочернем селекторе, который содержит элемент, который Вы хотите разработать. Этому родительскому элементу нельзя применять runat сервер. Проще говоря, это - хорошая идея запланировать Ваши структурные контейнеры для не выполнения кода позади (т.е. никакой runat), тот способ, которым можно получить доступ к главным частям приложения/сайта с помощью неизмененных идентификаторов. Если слишком поздно, чтобы сделать так, добавьте отделение/промежуток обертки или используйте решение для класса, как упомянуто.

0
ответ дан 6 December 2019 в 19:45
поделиться

.NET будет всегда заменять Ваши значения идентификаторов некоторыми искаженными (каждый настолько немного предсказуемый, но все еще не рассчитывайте на него), значение. У Вас должен действительно быть тот идентификатор runat=server? Если Вы не вставите runat=server, то он не исказит его...

ДОБАВЛЕННЫЙ: Как сказанный leddt, можно сослаться на промежуток (или любой runat=server с идентификатором) при помощи ClientID, но я не думаю что работы в CSS.

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

Так, имея это в виду, действительно ли Вашим заданием рефакторинга является CSS, добирающийся, чтобы быть немного больше в объеме?

0
ответ дан 6 December 2019 в 19:45
поделиться

@Matt Dawdy: существует некоторое большое использование для идентификаторов в CSS, прежде всего, когда Вы хотите разработать элемент, который Вы знаете, только появляется однажды или в веб-сайте или в странице, такой как кнопка выхода из системы или титульные данные.

0
ответ дан 6 December 2019 в 19:45
поделиться

Лучшая вещь сделать вот, дают ему уникальное имя класса.

0
ответ дан 6 December 2019 в 19:45
поделиться

Я не знаю о способе мешать.NET исказить идентификатор, но я могу думать о паре способов работать вокруг этого:

1 - Промежутки вложенного множества, один с runat = "сервер", один без:

<style type="text/css">
#position_title { // Whatever
}
<span id="position_titleserver" runat="server"><span id="position_title">Manager</span></span>

2 - Как предложенный Joel Coehoorn, используйте уникальное имя класса вместо этого. Уже с помощью класса для чего-то? Не имеет значения, можно использовать больше чем 1! Это...

<style type="text/css">
.position_title { font-weight: bold; }
.foo { color: red; }
.bar { font-style: italic; }
</style>
<span id="thiswillbemangled" class="foo bar position_title" runat="server">Manager</span>

... отобразит это:

Менеджер

3 - Запишите функцию JavaScript для фиксации идентификаторов после загрузок страницы

function fixIds()
{
    var tagList = document.getElementsByTagName("*");
    for(var i=0;i<tagList.length;i++)
    {
        if(tagList[i].id)
        {
            if(tagList[i].id.indexOf('$') > -1)
            {
                var tempArray = tagList[i].id.split("$");
                tagList[i].id = tempArray[tempArray.length - 1];
            }
        }
    }
}
0
ответ дан 6 December 2019 в 19:45
поделиться

Хорошо, я предполагаю, что жюри отсутствует на этом.

@leddt, я уже знал, что 'дерьмо' было контейнерами, окружающими его, но я думал, возможно, что Microsoft оставит бэкдор для оставления идентификатора в покое. Регенерация файлов CSS на каждом использовании включением ClientIDs была бы ужасной идеей.

Меня или оставляют с использованием классов везде или некоторых искаженные смотрящие идентификаторы hardcoded в CSS.

0
ответ дан 6 December 2019 в 19:45
поделиться

Большинство мер предложило ее, излишество для очень простой проблемы. Просто имейте отдельные отделения и промежутки, для которых Вы нацелены с CSS. Не будьте нацелены на средства управления ASP.NET непосредственно, если Вы захотите использовать идентификаторы.

  <span id="FooContainer">
     <span runat="server" id="Foo" >
         ......
     <span>
  </span>
1
ответ дан 6 December 2019 в 19:45
поделиться

'Дерьмо', помещенное перед идентификатором, связано с контейнером (контейнерами) управления и нет никакого пути (насколько я знаю) предотвратить это поведение, кроме не помещения его в любом контейнере.

Если необходимо обратиться к идентификатору в сценарии, можно использовать ClientID управления, как так:

<script type="text/javascript">
    var theSpan = document.getElementById('<%= position_title.ClientID %>');
</script>
5
ответ дан 6 December 2019 в 19:45
поделиться

Можно встроить CSS в странице, опрыснутой некоторыми тегами сервера для преодоления проблемы. Во времени выполнения блоки кода будут заменены сгенерированными идентификаторами ASP.NET.

Например:

[style type="text/css"]
  #<%= AspNetId.ClientID %> {
      ... styles go here...
  }
[/style]

[script type="text/javascript"]
   document.getElementById("<%= AspNetId.ClientID %>");
[/script]

Вы могли пойти немного далее и иметь некоторые файлы кода, которые генерируют CSS также, если Вы хотели содержать свой CSS в отдельном файле.

Кроме того, я могу забегать вперед немного здесь, но Вы могли использовать материал MVC ASP.NET (еще официально выпущенный с этой записи), который убегает от Веб-форм и дает Вам полный контроль над сгенерированной разметкой.

1
ответ дан 6 December 2019 в 19:45
поделиться

Вы, вероятно, оказываетесь перед необходимостью удалять runat = "сервер" от промежутка и затем помещать в промежутке, таким образом, можно стилизовать промежуток и все еще иметь динамическое внутреннее содержание.

Не изящное или легкое решение (и это требует перекомпилировать), но это работает.

0
ответ дан 6 December 2019 в 19:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: