динамическое изменение источника тега скрипта на стороне C#


Как я могу динамически изменить <script> src атрибут из Page_Load?

Когда я говорю динамический, я на самом деле имею в виду, что это одна и та же Страница Default.aspx, но каждое обновление ссылается на другой источник js. Логика, лежащая в основе выбора файла js, не имеет никакого значения, просто механизм его установки.

Я попробовал:

<script id="script1" runat="server" language="javascript" src="a.js" type="text/javascript"></script>

Но script1 недоступно на стороне .cs. Я знаю, что могу изменить его на стороне .aspx, используя теги <% %>, но я не хочу чтобы моя логика была встроена таким образом в мою .aspx. Должен быть способ сделать это на стороне .cs в Page_Load?

4 2

4 ответа:

В обработчике загрузки страницы у вас может быть что-то вроде этого

string csurl = null;
string csname = "myscript";
if (condition)
{
    csurl = "~/a.js";
}
else    
{  
    csurl = "~/b.js";
}

if (!Page.ClientScript.IsClientScriptIncludeRegistered(cstype, csname))
{
    Page.ClientScript.RegisterClientScriptInclude(
        this.GetType(), 
        csname, 
        ResolveClientUrl(csurl));
}

Или

 string csurl = null;
 if (condition)
 {
     csurl = "a.js";
 }
 else    
 {  
     csurl = "b.js";
 }
 Literal script = new Literal();
 script.Text = string.Format(
     @"<script src=""{0}"" type=""text/javascript""></script>",csurl);
 Page.Header.Controls.Add(script);

Есть несколько способов сделать это. Один из подходов заключается в создании метода protected или public в вашем codebehind, который возвращает string, который возвращает правильный URL-адрес для вашего Javascript на основе ваших критериев. Затем просто вызовите этот метод из своей разметки, например:

<script language="javascript" src="<%=GetJavaScriptUrl() %>" type="text/javascript"></script>

В этом примере предполагается, что вы вызываете метод в своем codebehind GetJavaScriptUrl.

К сожалению, я не думаю, что у вас есть большой выбор, кроме как использовать <%= %>.

Если кто-то не знает другого (если это так, пожалуйста, прокомментируйте, и я изменю), использование атрибута runat="server" в блоке <script> будет означать, что блок будет выполнен на стороне сервера.

Обновить

Извините, я немного неправильно понял ваш вопрос.

Я думал, вы говорите, что не хотите использовать <% %> для установки атрибута src блока <script>. Я сейчас поймите, вы имели в виду создание отдельных блоков <script> для каждого файла, отображаемых через логические блоки <%If x Then%><%Else%><%End If%>.

Как уже заявили другие (и я намекнул на это), вы можете установить атрибут src с помощью <%=GetSrcPath()%> и иметь логику в методе GetSrcPath в своем коде.

Просто используйте диспетчер сценариев:

Например,

string jsName = condition ? "a.js" : "b.js";

ScriptManager.GetCurrent(this).Scripts.Add(new ScriptReference(jsName));