Возврат каретки (ASCII chr 13) отсутствует в значениях обратной передачи текстового поля при использовании на панели обновления ASP.NET - PullRequest
3 голосов
/ 26 октября 2010

У меня есть ASP.NET TextBox с TextMode = TextBoxMode.MultiLine, который используется в панели обновления AJAX. Значение .Text было предварительно установлено на значение, содержащее несколько строк.

При использовании Chrome (7.0.517.41) или Firefox (3.6.11) при работе с элементами управления, отправленными обратно на сервер, возврат каретки теряется, если пользователь не отредактировал предварительно установленное значение.

например. Начальное значение .Text устанавливается при загрузке страницы:

"строка 1 / r / nline2 / r / nline3"

Значение .Text при обратной передаче из Chrome или Firefox, где пользователь редактировал текстовое поле:

"строка 1 / r / nline2 / r / nline3"

Значение .Text при обратной передаче из Chrome или Firefox, где пользователь не редактировал текстовое поле:

"строка 1 / nline2 / nline3"

Почему возврат каретки теряется и как я могу это решить?

1 Ответ

5 голосов
/ 26 октября 2010

Я нашел сообщение в блоге Крейга Вардмана Textbox CrLf в Firefox с использованием AJAX UpdatePanel , в котором описана та же проблема.

При использовании текстового поля MultiLine внутри ASP.На панели обновления NET AJAX вы можете столкнуться с проблемами с переводом каретки в тексте на сервере, используя Firefox (и, возможно, другие браузеры).

Internet Explorer использует стиль CrLf в Windows (13 10) для перевода строки вtextarea, но Firefox использует только стиль Unix Lf (10).

При синхронной обратной передаче кажется, что ASP.NET исправляет это, и вы получите CrLf в вашем тексте на сервере.Однако, когда вы отправляете сообщения асинхронно, используя AJAX, вы получаете только Lf в своем тексте, когда используется Firefox.

Его предлагаемое решение - решить проблему на стороне сервера:

public static string CleanUnixCrLf(string textIn)
{
   //firefox only uses Lf and not CrLf
   return System.Text.RegularExpressions.Regex.Replace(textIn, "([^\r])[\n]", "$1\r\n");
}

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

Редактировать

Это решениене обрабатывает несколько соседних новых строкДобавление .Replace("\n\n", "\n\r\n") к другой замене - это один из вариантов.

...