敲除文本区域值绑定显示换行符的 ASCII 字符?

knockout textarea value binding shows ASCII characters for line breaks?

我有一个剔除值绑定文本区域,如下所示:

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

但是,当保存带有换行符或额外 spaces 的数据时,下次查看该页面时它会以 ASCII 字符显示。像这样:

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

当我查看数据库中的值时,它没有这些字符:

Overview being explained here in this box.

Test stuff test stuff.

事实上,即使在数据传递到视图之前的视图模型中,一切看起来都是正确的:

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

最后,即使是第一次输入,敲除 属性 pageModel().test() 也会显示这样的文本:

"Overview being explained here in this box.

Test stuff test stuff."

那么为什么 knockout 最后用 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 中断,因为有一个 space 行之间没有正确的字符串结尾。

我也尝试转义 \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 是一种无法验证的单向绑定。所以我仍然需要使用值绑定。

如何让它工作?

您可能正在寻找

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

或者正如您针对 .NET Core 指出的那样,您将需要

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