2010-07-13 4 views
0

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

У меня есть общедоступное свойство, которое возвращает логическое значение в моем коде. Я хотел бы получить доступ к этой переменной сервера в моей функции проверки javascript, но до сих пор не совсем понял ее.

Public Property editMode() As Boolean 
    Get 
     If Cache("editMode") IsNot Nothing Then 
      Return (DirectCast(Cache("editMode"), Boolean)) 
     Else 
      Return False 
     End If 
    End Get 
    Set(ByVal value As Boolean) 
     Cache("editMode") = value 
    End Set 
End Property 

function validateEdit() 
{ 
    alert("editMode value is " + '<%#editMode()%>'); 
    if ('<%#editMode()%>'.toString() == "True") 
    { 
     alert("You are currently in edit mode. Please save or cancel changes."); 
     return false; 
    } 
    return true; 
} 

Я пробовал кучу вариаций на этом, но это всегда False. В текущем коде возвращается бдительной «значение Editmode является Ложным»

Когда я использую:

if ('<%#editMode()%>') ... 

Тогда он по-прежнему всегда Ложный, но он переходит в, если условие, так что поведение, как если бы это было всегда правда.

Еще одна вещь, чтобы отметить, что тег большинство JavaScript/сервер вещи я считаю, говорит использовать <% = Editmode%>, но я не могу это сделать, потому что каждый раз, когда я использую = вместо # I получить исключение:

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

Так что я решил эту проблему с помощью # и говоря

Page.Header.DataBind() 
    Page.Form.DataBind() 

В обработчик события загрузки страницы.

Любые идеи? Заранее спасибо. :)

(Кроме того, я обычно использую C#, так что я мог бы неосознанно сделать что-то глупое в VB части, так что не стесняйтесь, чтобы указать, что слишком)

+0

Когда и как вы устанавливаете значение True? – womp

+0

В кодовом замке, при нажатии кнопки. – Brandi

ответ

0

Это помогло мне исправить ошибку. "The Controls collection cannot be modified because the control contains code blocks"

Перемещение функции javascript из головы и в тело устраняет проблему. Кажется, это несколько вещей, которые могут вызвать эту проблему, но в моем случае наиболее вероятным виновником является AjaxToolKit.

1

Во-первых, попробуйте изменить следующим образом:

<%=editMode()%> 

Не уверен, что все, но это не может повредить. Во-вторых, находитесь ли вы в режиме редактирования при первой загрузке страницы? Этот код будет работать на стороне сервера и вернуть результат пользователю.

На странице пользователя, они будут видеть:

function validateEdit() 
{ 
    alert("editMode value is " + 'False'); 
    if ('False'.toString() == "True") 
    { 
     alert("You are currently in edit mode. Please save or cancel changes."); 
     return false; 
    } 
    return true; 
} 

Опять же, не уверен, что это, но важно понимать, что Javascript не делает никаких вызовов на сервер.

+0

Насколько я вижу, это правильно на стороне сервера. editMode изменяется как следует, и он не начинается как истинный. Если вы прочтете мой пост, я уже пробовал <% = editMode()%>, возможно, вы можете сказать мне, что такое ошибка? – Brandi

+0

Вы сказали это в своем комментарии: editMode не начинается с истины. Таким образом, JavaScript отображается, как я показал вам, и вызов validateEdit() всегда будет * возвращать одно и то же значение. – riwalk

+0

Мне, должно быть, не хватает того, что вы имеете в виду? Я, вероятно, должен был упомянуть, что знаю почти zip о JavaScript ... У меня есть кнопка, которая меняет ее на стороне сервера, но она все равно возвращает false, даже после того, как я прохожу через отладку, чтобы убедиться, что это правда. Разве это не должно быть «True'.toString() ==« Правда »? Честно говоря, мое лучшее предположение прямо сейчас состоит в том, что # не должно оценивать то, как я думаю. – Brandi

0

Еще одна вещь.

Вы понимаете, что вы конвертируете строку в другую строку с

'<%#editMode()%>'.toString() 

Right?

Я думаю, что вы хотите, это

if ('<% =editMode.toString() %>'= 'True')... 

или еще лучше

if (<% =editMode.toString().ToLower() %>)... 
+0

Хорошо, как упоминалось в сообщении, я понимаю, что = более широко используется, и я пытаюсь снова и снова использовать его, но почему я получаю исключение, которое я упоминал каждый раз, когда использую = вместо #? – Brandi

+0

Точка моего комментария была не о = vs #. Дело в том, что вы произвольно конвертируете литеральную строку в другую строку. Также логическое преобразование, вероятно, должно происходить на стороне сервера, а не на стороне клиента. – JohnFx