Русские символы при Callback
От: ASKant2  
Дата: 12.01.07 09:28
Оценка:
Не знаю сталкивался кто-нибудь с тем, что если в web.config прописана русская кодировка
<system.web>
<globalization culture="ru-RU" uiCulture="ru-RU" fileEncoding="windows-1251" responseHeaderEncoding="windows-1251" responseEncoding="windows-1251" requestEncoding="windows-1251"/>
</system.web>
то если на страничке есть дерево (TreeView) , а у него узел с русским именем, и включена дозагрузка ветвей с клиента (PopulateNodesFromClient="true"). Соотвественно при попытке получить потомков узла (callback) получаем
ошибку: "Input string was not in a correct format." В то же время, если убрать определение requestEncoding="windows-1251", то оно становится по умолчанию requestEncoding="utf-8". Но в этом случае теряется содержимое полей формы (с русскими символами) на других страницах. Решение получилось таким:
//Перегружаем метод InitializeCulture() класса Page.
protected override void InitializeCulture()
{
  string cp = Page.Request.Params["__CALLBACKPARAM"];
  if (!string.IsNullOrEmpty(cp)) //Если был CallBack
  {
    //Исправляем кодировку
    byte[] ua = System.Text.Encoding.GetEncoding("windows-1251").GetBytes(cp);
    byte[] ba = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.GetEncoding("windows-1251"), ua);
    string s = new string(System.Text.Encoding.GetEncoding("windows-1251").GetChars(ba));
    //Устанавливаем свойство IsReadOnly=false для коллекций Params и Form
    Type nvcType = Page.Request.Form.GetType();
    nvcType.InvokeMember("IsReadOnly", BindingFlags.NonPublic | BindingFlags.SetProperty | BindingFlags.FlattenHierarchy | BindingFlags.Instance, null, Page.Request.Form, new object[] { false });
    nvcType.InvokeMember("IsReadOnly", BindingFlags.NonPublic | BindingFlags.SetProperty | BindingFlags.FlattenHierarchy | BindingFlags.Instance, null, Page.Request.Params, new object[] { false });
    //Подменяем значение переменной
    Page.Request.Form["__CALLBACKPARAM"] = s;
    Page.Request.Params["__CALLBACKPARAM"] = s;
  }
  base.InitializeCulture();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.