【问题标题】:HTML <textarea> only sends '\n' back to the serverHTML <textarea> 仅将 '\n' 发送回服务器
【发布时间】:2025-12-29 04:20:14
【问题描述】:

我们的应用程序既有 .NET 离线应用程序(WinForms 和 WPF),也有在线 ASP.NET MVC。

我们的离线应用程序用 /r/n(回车 + 换行)表示新行。

当我们将这些放在在线表单上时,特别是文本区域 - 如果用户更改了文本区域中的任何内容,浏览器会自动从文本中删除所有 /r 字符。从而打破了线下同行。

奇怪的是,如果用户没有更改任何内容,则保留回车。

理想情况下,我不想逐个解决这个问题,因为那会浪费很多精力。

有什么方法可以使用 MVC 过滤器来转换 \n => \r\n 其中 \r 不存在。或者,如果这不可能,我们已经在使用 JSON.NET 值提供程序工厂来解析 JSON as discussed here - 也许我现在可以截取字符串值?

有没有其他人有这方面的经验,我最好的选择是什么?

【问题讨论】:

  • 我的第一个想法是.Replace("\n", "\r\n").Replace("\r\r", "\r")。但这可能不是最有效的方法。
  • 如何将回车/等编码成ascii?

标签: c# asp.net asp.net-mvc json


【解决方案1】:

由于时间紧迫,我不得不快速实现一些东西,所以我在JsonNetValueProviderFactory 中添加了一些东西,它只是做了一些正则表达式替换。可能不是最快的,但似乎可以解决问题。

我会暂时搁置这个问题,以防出现更好的解决方案。

private static readonly System.Text.RegularExpressions.Regex _orphanEOLChecker =
    new System.Text.RegularExpressions.Regex(@"((?<!\r)\n)|(\r(?!\n))",
            System.Text.RegularExpressions.RegexOptions.Compiled &
            System.Text.RegularExpressions.RegexOptions.Multiline);
private const string _newLineReplacement = "\r\n";

private static string FixCarriageReturns(string val)
{
    if (string.IsNullOrEmpty(val))
        return val;

    return _orphanEOLChecker.Replace(val, _newLineReplacement);
}

【讨论】:

  • 感谢您回来为面临同样问题的未来用户添加您自己的解决方案!