Привязка значения текстовой области для нокаута показывает символы ASCII для разрывов строк? - PullRequest
1 голос
/ 25 апреля 2019

У меня есть текстовое поле, привязанное к значению нокаута:

<textarea class="form-control" data-bind="value: test" name="test" rows="4"></textarea>

Однако при сохранении данных с переносами строк или лишними пробелами при следующем просмотре страницы они отображаются с символами ASCII. Вот так:

Overview being explained here in this box.&#xA;&#xA;Test stuff test stuff.

Когда я смотрю на значение в базе данных, в нем нет этих символов:

Обзор объясняется здесь, в этом окне.

Тестовый материал Тестовый материал.

Действительно, даже в модели представления перед передачей данных в представление все выглядит правильно:

Overview being explained here in this box.\n\nTest stuff test stuff.

И, наконец, даже при первом вводе свойство нокаута pageModel().test() также отображает следующий текст:

"Обзор объясняется здесь, в этом окне.

Тестовые материалы. Тестовые материалы. "

Так почему же нокаут наконец-то отображает его с помощью символов ASCII? Моя модель KO выглядит следующим образом, когда значение уже введено:

self.test = ko.observable('Overview being explained here in this box.&#xA;&#xA;Test stuff test stuff.');

Хорошо, тогда это проблема MVC, потому что я называю это так:

self.test = ko.observable('@Model.Test');

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

Я также пытаюсь просто экранировать символы \ r \ n:

self.test = ko.observable('Overview being explained here in this box.\\n\\nTest stuff test stuff.');

Это не решает проблему, но я все равно получаю двойной &#xA;.

Как, черт возьми, я могу заставить это работать правильно, все еще используя привязку значений? Потому что я использую knockout.validation, и я мог бы сделать эту работу с помощью привязки html и использовать небольшой взлом:

<textarea class="form-control" data-bind="value: test, event: { keyup: function(data, event) { data.test(event.target.value); } }" name="test" rows="2"></textarea>

Но это полностью нарушает валидационную проверку для любых текстовых областей, потому что html - это односторонняя привязка, которая не проверяется. Поэтому мне все еще нужно использовать привязку значения.

Как заставить это работать?

1 Ответ

1 голос
/ 26 апреля 2019

Возможно, вы ищете

self.test = ko.observable('@HttpUtility.JavaScriptStringEncode(ViewBag.Test)');

или, как вы указали для .NET Core, вам понадобится

@(JavaScriptEncoder.Default.Encode(question.Test))
...