完整回发与异步回发中asp:TextBox的多行换行符不同

3

我有一个设置为多行模式的文本框。其中的文本属性包含了一些换行符(\r\n)。

为什么在完全回发(postback)时返回的数据会与异步回发(async postback)时不同,异步回发时返回的是"\n"而非"\r\n"?

用户代理:IE、Firefox、Edge、Chrome


ASPX:

    <asp:UpdatePanel runat="server" ID="up">
        <ContentTemplate>

            <asp:TextBox runat="server" ID="tbText" TextMode="MultiLine" Height="200px" />

            <asp:Label runat="server" ID="lDump" /><br />
            <asp:Button runat="server" ID="btnAsync" Text="Async postback" />

        </ContentTemplate>
    </asp:UpdatePanel>

    <asp:Button runat="server" ID="btnFull" Text="Full postback" />

aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        btnAsync.Click += Dump;
        btnFull.Click += Dump;

        if (!IsPostBack)
            tbText.Text = "Line1\r\nLine2\r\nLine3";
    }

    private void Dump(object sender, EventArgs e)
    {
        lDump.Text = tbText.Text.Replace("\r", "[CR]").Replace("\n", "[LF]");
    }

输出:

  • 异步回发:行1[换行]行2[换行]行3
  • 完整回发:行1[回车][换行]行2[回车][换行]行3
1个回答

1
如果您使用Firefox/Chrome或其他使用类Unix的浏览器,该行为是设计上的,因为它们使用LF(ASCII中的0x0A)作为行尾。如this post所述:

最常见的区别(也可能是唯一值得担心的区别)是Windows上以CRLF结尾,Unix-like上以NL(LF)结尾,而老式Mac上则以CR结尾(随着OS X的更改,情况已变得像Unix)。请注意,从LF到NL的含义转变,对于完全相同的字符,造成了Windows和Unix之间的差异。

然而,在使用Windows样式的行末(CRLF/ 0x0D0A在ASCII中)的IE中,相同的异步回发将返回所需的结果,如下图所示:

CRLF in IE vs other browsers

在标准的postback中,由多行TextBox控件产生的textarea使用完整的POST方法将其内容发送到服务器,并在服务器端进程中遵循Windows风格的行结尾,这是导致呈现不同行为的原因。然而,在异步postback中,仅使用与浏览器相关的AJAX请求更新UpdatePanel的内容。
Craig Wardman在使用类Unix行结尾的浏览器中确认了这种行为,并提出了一种解决方案,在服务器端使用Regex.Replace来规范同步和异步postback的CRLF的使用(请参见参考文献部分)。

在同步postback中,似乎ASP.NET会修复这个问题,并且您将在服务器上获得CrLf的文本。但是,当您使用AJAX进行异步postback时,仅在使用Firefox时,您的文本中才会获取Lf。

参考文献:ASP.NET中的异步和同步postback

使用AJAX UpdatePanel在Firefox中的文本框换行符


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接