2012-01-28 2 views
1

У меня возникают проблемы с настройкой переменных JavaScript на стороне сервера в веб-формах ASP.Net (не MVC) с использованием мастер-страниц.Инициализация переменных JavaScript на стороне сервера

В основном я хочу сделать что-то вроде этого:

<script type="text/javascript"> 
    var z = '<%# Request.QueryString["Env"] %>'; 
</script> 

После я запускаю код, который я вижу: вар г =»»;

Я также попытался:

вар г = '<% = Request.QueryString [ "ко"]%>';

После я запускаю этот код я получаю следующее сообщение об ошибке поэтому я предполагаю, что это не правильно:

Коллекция Controls не может быть изменена, поскольку контроль содержит блоки кода (т.е. <% ...%>).

Я занимаюсь главным образом развитием MVC за последние несколько лет, поэтому не уверен, что я делаю неправильно.

Пожалуйста, дайте мне знать.

Благодаря

+0

Я тоже далеко от WebForms, но ваш второй фрагмент выглядит так, как я помню. Можете ли вы опубликовать немного больше окружающего кода? –

+0

Динамический javascript - это известный анти-шаблон. Не делай этого дерьма. – Raynos

+0

@Raynos: Я думаю, вы не делаете много развития MVC, так как он используется повсюду. – Richard

ответ

3

Я думаю, что это хорошая идея, чтобы поместить JavaScript как раз перед закрытием тега тела вместо головы тега.Затем вы можете использовать <% = синтаксис.

+0

Спасибо, что ответили. Я использовал этот вариант, и он сработал. Благодарю. – Richard

1

любой шанс, что Javascript блок вы упоминаете внутри серверного элемента управления?

, например:

<head runat="server"> 
    <script type="text/javascript"> 
    var z = '<%# Request.QueryString["Env"] %>'; 
    </script> 
<head> 

если так попробовать изменить его на:

<head runat="server"> 
    <div runat="server"> 
     <script type="text/javascript"> 
     var z = '<%= Request.QueryString["Env"] %>'; 
     </script> 
    </div> 
<head> 

ссылка: http://www.west-wind.com/weblog/posts/2006/May/27/The-Controls-collection-cannot-be-modified-because-the-control-contains-code-blocks-ie-

+0

спасибо @Aristos, отредактировано –

0

Я был бы соблазн использовать

ClientScript.RegisterClientScriptBlock(GetType(), "scriptBlockKey", 
     "var z = '" + Request.QueryString["Env"] + "';", true); 

Это ШОУ ld напишите в блоке скрипта, который вам нужен, с тегами скрипта (конечный аргумент установлен в true).

Он называется со стороны сервера, поэтому просто введите его в Page_Load. У него есть преимущество быть легче отлаживать, все идет не так.

Я был бы соблазн к нулевому проверки на строку запроса, а также с tenary оператором I, E,

string env = Request.QueryString["Env"] == null ? string.Empty : 
            Request.QueryString["Env"].ToString(); 
    ClientScript.RegisterClientScriptBlock(GetType(), "scriptBlockKey", 
      "var z = '" + env + "';", true); 

Просто делает нулевой проверить немного более прозрачным и, возможно, дает возможность для по умолчанию.

+0

Спасибо, что ответили. Я использовал этот вариант, и он сработал. Тем не менее, я решил пойти с другим ответом, чтобы решить мою проблему, поскольку это было немного меньше изменений. Еще раз спасибо. – Richard

0

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

<script type="text/javascript"> 
    <asp:literal run="server" id="txtJavaDeclarations" EnableViewState="false" /> 
</script> 

на коде позади

txtJavaDeclarations.Text 
     = string.Format("var z = '{0}' ;\n", Request.QueryString["Env"]); 
Смежные вопросы