Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Короткий ответ: нет. Вы могли, конечно, прокрутить свои собственные функции (как CMPalmer предполагает) взять встроенные ресурсы CSS (как Gulzar предлагает), и встройте их на странице.
Как вопрос лучшей практики, тем не менее, я не уверен, почему Вы хотели бы сделать это. При создании допускающего повторное использование управления, которое имеет большое моделирование CSS, мой совет был бы только к твердому коду именами классов в совместимый стандартами вывод управления и поставил бы управление, сопровождаемое предложенной таблицей стилей. Это дает Вашим пользователям/клиентам опцию переопределения Ваших предложенных стилей для установки их потребностям и в целом позволяет им справляться со своей установкой CSS, как они считают целесообразным.
Разделение стиля от разметки является Хорошей Вещью - Вы уже направляетесь вниз правильный путь в предотвращении различных встроенных атрибутов стиля ASP.NET, но необходимо взять все это путь и не допустить CSS в .dll.
Можно добавить ссылки-заголовки к файлам CSS в ASP.NET codebehind классы как это:
HtmlLink link = new HtmlLink();
link.Href = "Cases/EditStyles.css";
link.Attributes.Add("type", "text/css");
link.Attributes.Add("rel", "stylesheet");
this.Header.Controls.Add(link);
Можно выполнить итерации посредством средств управления заголовком заранее, чтобы видеть, там ли это уже. Показанный пример от Page_Load в одном из моих проектов и в условном выражении, которое только добавляет EditStyles.css, если страница, как предполагается, находится в режиме "Edit".
Для ClientScriptManager. RegisterClientScriptBlock и ClientScriptManager. RegisterClientScriptResource, у них есть эквивалентные функции для проверки, если они были уже зарегистрированы (например, IsClientScriptrResourceRegistered).
Еще одна мысль: Вы могли бы хотеть считать "пространство имен" Вашими именами классов для предотвращения коллизий с общими именами классов, которые могли бы уже использовать потребители. Например.
<div class="SmillerControls_Toolbar">
<a class="SmillerControls_Button" ...>...</a>
...
</div>
или Вы могли перенести все это в единственный класс "пространства имен" и затем записать Ваш CSS в это:
<div class="SmillerControls">
<div class="Toolbar">
<a class="Button" ...>...</a>
</div>
</div>
Ваш CSS был бы похож
div.SmillerControls div.Toolbar
{
...
}
div.SmillerControls div.Toolbar a.Button
{
...
}
Я использовал файлы CSS в качестве Встроенных ресурсов.
Я использую
<asp:Literal id="cssliteral" runat="server" />
в head, а затем StringBuilder на PageLoad, который содержит динамический css скрипт.
StingBuilder str = new StringBuilder();
str.Append("<style type="text/css">");
str.Append(".myclass {background-color:#" + mycolor);
str.Append("</style>");
cssLiteral.Text = str.ToString();
Просто проверьте наличие зарегистрированного скрипта и если вы обнаружите, что его там нет, тогда вы узнаете, что это первый раз, когда ваш элемент управления создается. В этот момент вы можете просто перетащить на свою страницу буквальный элемент управления, указывающий на нужный вам файл css.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
With Page.ClientScript
If Not .IsClientScriptIncludeRegistered("JQuery") Then
.RegisterClientScriptInclude("JQuery", "Scripts/jquery-1.4.2.min.js")
Dim l As New Literal()
l.Text = "<link href='Uploadify/uploadify.css' rel='stylesheet' type='text/css' />"
sender.controls.add(l)
End If
End With
End Sub
Надеюсь, это кому-то поможет.