Вот код для облачного запроса 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;
}
Используйте jQuery для выбора элемента:
$("span[id$='position_title']")....
гибкие селекторы jQuery, особенно 'начинается' с/'ends с селекторами' ('конец с' селектором показывают выше, обеспечьте отличный способ вокруг dom идентификатора ASP.NET munge.
RP
Если Вы получаете доступ span
или независимо от того, что тег дает Вам проблемы от C# или кода VB позади, затем runat="server"
должен остаться и необходимо использовать вместо этого <span class="some_class" id="someID">
. Если Вы не получаете доступ к тегу в коде позади, то удаляете runat="server"
.
Я уверен, что это спросили здесь по крайней мере однажды. Термин 'портит'. Rich Strahl записал сообщение об этом в 2006 также.
Я обычно делаю свое собственное управление, которое расширяет WebControl или HtmlGenericControl, и я переопределяю ClientID - возврат свойства ID вместо сгенерированного ClientID. Это вызовет любое преобразование, которое.NET делает к ClientID из-за именованных контейнеров, которые вернутся назад к исходному идентификатору, который Вы указали в разметке тега. Здорово, если Вы пользуетесь клиентскими библиотеками как jQuery и нуждаетесь в предсказуемых уникальных идентификаторах, но жесткий при доверии состоянию отображения для чего-нибудь серверная сторона.
Существует ли конкретная причина, что Вы хотите, чтобы средства управления были runat = "сервер"?
Если так, я второй использование <asp: Литерал>...
Это должно сделать задание для Вас, поскольку Вы все еще сможете отредактировать данные в коде позади.
Если Вы боитесь classitus, попытайтесь использовать идентификатор на родительском или дочернем селекторе, который содержит элемент, который Вы хотите разработать. Этому родительскому элементу нельзя применять runat сервер. Проще говоря, это - хорошая идея запланировать Ваши структурные контейнеры для не выполнения кода позади (т.е. никакой runat), тот способ, которым можно получить доступ к главным частям приложения/сайта с помощью неизмененных идентификаторов. Если слишком поздно, чтобы сделать так, добавьте отделение/промежуток обертки или используйте решение для класса, как упомянуто.
.NET будет всегда заменять Ваши значения идентификаторов некоторыми искаженными (каждый настолько немного предсказуемый, но все еще не рассчитывайте на него), значение. У Вас должен действительно быть тот идентификатор runat=server? Если Вы не вставите runat=server, то он не исказит его...
ДОБАВЛЕННЫЙ: Как сказанный leddt, можно сослаться на промежуток (или любой runat=server с идентификатором) при помощи ClientID, но я не думаю что работы в CSS.
Но я думаю, что у Вас есть большая проблема, если Ваш CSS использует основанные на идентификаторе селекторы. Вы не можете снова использовать идентификатор. У Вас не может быть нескольких объектов на той же странице с тем же идентификатором. .NET будет жаловаться на это.
Так, имея это в виду, действительно ли Вашим заданием рефакторинга является CSS, добирающийся, чтобы быть немного больше в объеме?
@Matt Dawdy: существует некоторое большое использование для идентификаторов в CSS, прежде всего, когда Вы хотите разработать элемент, который Вы знаете, только появляется однажды или в веб-сайте или в странице, такой как кнопка выхода из системы или титульные данные.
Лучшая вещь сделать вот, дают ему уникальное имя класса.
Я не знаю о способе мешать.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];
}
}
}
}
Хорошо, я предполагаю, что жюри отсутствует на этом.
@leddt, я уже знал, что 'дерьмо' было контейнерами, окружающими его, но я думал, возможно, что Microsoft оставит бэкдор для оставления идентификатора в покое. Регенерация файлов CSS на каждом использовании включением ClientIDs была бы ужасной идеей.
Меня или оставляют с использованием классов везде или некоторых искаженные смотрящие идентификаторы hardcoded в CSS.
Большинство мер предложило ее, излишество для очень простой проблемы. Просто имейте отдельные отделения и промежутки, для которых Вы нацелены с CSS. Не будьте нацелены на средства управления ASP.NET непосредственно, если Вы захотите использовать идентификаторы.
<span id="FooContainer">
<span runat="server" id="Foo" >
......
<span>
</span>
'Дерьмо', помещенное перед идентификатором, связано с контейнером (контейнерами) управления и нет никакого пути (насколько я знаю) предотвратить это поведение, кроме не помещения его в любом контейнере.
Если необходимо обратиться к идентификатору в сценарии, можно использовать ClientID управления, как так:
<script type="text/javascript">
var theSpan = document.getElementById('<%= position_title.ClientID %>');
</script>
Можно встроить 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 (еще официально выпущенный с этой записи), который убегает от Веб-форм и дает Вам полный контроль над сгенерированной разметкой.
Вы, вероятно, оказываетесь перед необходимостью удалять runat = "сервер" от промежутка и затем помещать в промежутке, таким образом, можно стилизовать промежуток и все еще иметь динамическое внутреннее содержание.
Не изящное или легкое решение (и это требует перекомпилировать), но это работает.