【问题标题】:Javascript var with a newline using MVC Model property带有换行符的 Javascript var 使用 MVC 模型属性
【发布时间】:2016-02-13 22:20:27
【问题描述】:

我必须设置一个 Javascript 变量以等于我的 MVC 模型中的一个属性。

我这样做是为了检测是否对文本框进行了任何更改,这是设置“原始”值。

我的 Javascript 代码如下所示:

var initVal = '@Model.ReferralHistoryDetail[1].ReferralComments';

我收到一个错误,我认为这是由于 cmets 中包含回车所致。

Uncaught SyntaxError: Unexpected token ILLEGAL

在这种情况下呈现的 HTML 将结束引号放在换行符上,这就是开发者控制台中显示的错误。

例如,渲染出来的 HTML 是:

        var initVal = 'blah blah blah
';

处理这个问题的正确方法是什么?

【问题讨论】:

  • 你想让它有那个CRLF吗?
  • 是的,我需要它。我需要检查数据库中最初的内容是否以任何方式(客户端)进行了更改。这是一个文本区域,因此它们可以有换行符。

标签: javascript asp.net-mvc asp.net-mvc-5


【解决方案1】:

您需要创建一个扩展方法,用
标签替换换行符。

或者使用HtmlEncode的方法 像这样:

var initVal = @Html.Raw(HttpUtility.HtmlEncode(@Model.ReferralHistoryDetail[1].ReferralComments).Replace("\n", "<br />"))

【讨论】:

  • 这会导致:var initVal = 'blah blah <br />';有同样的错误。
  • "initVal" 是 Javascript 变量。 Razor 代码看不到这一点,也无法将其传递给 HtmlEncode。
  • 我只是将值放在 initVal 中进行测试,因为我没有模型,您必须使用 Model.ReferalHistoryDe​​tail 语法,重新编辑。
  • 你很亲密...... HttpUtility.JavaScriptStringEncode() 是我所需要的。
  • 这对 äöå 进行编码,这在我的情况下是不需要的(然后发送到谷歌日历事件创建会搞砸)
【解决方案2】:

如果将\n 字符替换为\, 您将拥有多行字符串的有效语法。

这样应该可以工作
var initVal = '@Model.ReferralHistoryDetail[1].ReferralComments.Replace("\n","\\")';

我发现了其他允许在 javascript 中使用多行字符串的方法, 在this 回答。

【讨论】:

    【解决方案3】:

    你不能像这样从 JavaScript 访问模型属性,JavaScript 不能对你的模型做任何事情。

    在页面上方创建一个变量

    @{ var value = @Model.ReferralHistoryDe​​tail[1].ReferralComments;

    然后在javascript中访问值,虽然不知道为什么你不直接在页面上呈现为什么你需要javascript,除非我错过了什么

    【讨论】:

    • 我在原始问题中发布了这在我不得不处理换行符之前工作正常。我也发布了需要这个的原因。
    • @Patrick 工作?你说你有: Uncaught SyntaxError: Unexpected token ILLEGAL 我不确定它是如何工作的?
    • 你读过这个问题吗?该错误是由于文本区域中的 CRLF 而发生的。如果没有 CRLF,一切正常。 HTML 可以完美地呈现代码,但是其中有一个换行符会导致 Javascript 关闭。我必须对此进行编码。
    • 为什么不使用绑定,然后使用 Angular 或 Knockout 之类的东西
    • 在我的公司没有选择。
    【解决方案4】:

    您想使用 JavaScriptStringEncode 命令以与 javascript 兼容的方式对字符串进行编码。

    var initVal = '@HttpUtility.JavaScriptStringEncode(Model.ReferralHistoryDetail[1].ReferralComments)';
    

    【讨论】:

    • 这就是我要找的那个。谢谢。
    • 知道为什么这个测试现在在这种情况下会返回 false 吗? $(this).val() != initVal"。我正在将实际值写入开发人员控制台,但它们不相等......一个包含带有一些新文本的换行符,另一个不包含,但 Javascript 说他们是平等的。
    • 例如,这是放入 else 块(“值匹配”)......他是开发控制台显示的内容:原始:blah blah 当前:blah blah test 值匹配
    • 我在您的评论中看不到任何可以解释为什么会发生这种情况的内容。我只能建议使用“!==”和“===”运算符,因为它们给出了更准确的答案,当你打算比较时注意分配,检查你的括号,如果你正在使用否则,请考虑将真正的块放在首位,即if (x === y),因为通常更容易将您的头脑围绕该逻辑。
    • 我解决了,在一个相当复杂的块中并且绕过了检查,只是我的一个错误。感谢您的帮助,您的答案正是我想要的。
    猜你喜欢
    • 2016-11-21
    • 2019-05-17
    • 2013-04-28
    • 2017-09-06
    • 2016-03-08
    • 1970-01-01
    • 2020-05-10
    • 2020-11-02
    • 2019-04-25
    相关资源
    最近更新 更多