No estoy seguro de por qué el código siguiente no está funcionando como se pretendía:

litMessage.Text = messageBody.Replace(Environment.NewLine, "<br/>")

Donde litMessage es el nombre de la literal de control y messageBody es el nombre de la variable de cadena.

Mi intención es la salida de una cadena en una página web, y sustituir los saltos de línea con una etiqueta br, de modo que se pueda mostrar en la página correctamente. Sin embargo, nada es reemplazado. Al ver el código fuente de la página, se ve como los saltos de línea todavía existen en la cadena. Del mismo modo, cuando se muestra la cadena a través de MsgBox, muestra normalmente así. También he tratado de envolver el de salida con el pre etiqueta y muestra los saltos de línea correctamente también.

La cadena fue originalmente introducido por un usuario a través del uso de un asp:Textbox y se guardan en una base de datos MSSQL. Se recuperan y se muestran en otra página web, utilizando un asp:Literal control. La única cosa que sucede a la cadena antes de que sea presentado es que es recortada (es decir,textbox.Text.Trim()).

Tal vez hay algo que no me cuenta?

Editar #1: Debido a las limitaciones de tiempo, he decidido ajustar el texto con el pre etiqueta. Es un trabajo aceptable en torno a como se conservan los saltos de línea. Por desgracia, no explica por qué el código no funciona en el primer lugar. Mientras tanto, me voy a dejar la pregunta sin respuesta hasta que me encuentro con una respuesta apropiada.

Edición #2: Solución encontrada y respondidas a continuación. UpdatePanel etiqueta que se añade a la pregunta de referencia para el futuro.

Por qué no usar myString.Replace(«\n», «<br/>») en su lugar? Reemplazo funcionará en todas las plataformas, desde «\n» está contenida en cada versión de la nueva línea de símbolo.
no siempre, al parecer :-): en.wikipedia.org/wiki/Newline#Representations
Galkin lo he probado y el resultado es el mismo.

OriginalEl autor nullexception | 2011-11-24

12 Comentarios

  1. 6

    Después de repasar este tema, he encontrado que los updatepanels estaban causando el problema.

    Haciendo algunas pruebas más, miré a lo que la cadena contenida usando el siguiente código:

    MsgBox(textbox.Text.Contains(vbCr))
    MsgBox(textbox.Text.Contains(vbCrLf))
    MsgBox(textbox.Text.Contains(vbNewLine))
    MsgBox(textbox.Text.Contains(Environment.Newline))

    Las cuatro declaraciones devuelve false. Esto fue probado en la cadena antes de enviar a la base de datos así como en la cadena recuperados de la base de datos.

    Desde mi punto de vista, tenía que haber algo en el marcado que fue la eliminación de los saltos de línea. Al principio, pensé que el Literal, cuadro de texto, y los controles de Etiqueta hizo algo divertido para los saltos de línea cuando se recuperan en el código detrás. Este no es el caso (y sería extraño si Microsoft a dejar que esto suceda).

    Peinado a través de el código un poco más, me encontré con que todos estos controles se encontraban dentro de un UpdatePanel. Recordando mis anteriores experiencias negativas con UpdatePanels, luego he pensado que este podría ser el culpable. He quitado y he aquí, los saltos de línea no desaparece en el código. El código que he publicado justo por encima de todos los devuelve true.

    Ambas páginas tenido los controles para presentar el texto y visualización de texto dentro de un UpdatePanel. He encontrado que los saltos de línea desapareció cuando se recupera el texto de la página. Cuando se muestra el texto en la página, el UpdatePanel no alterar la cadena de ninguna manera. El código siguiente terminó trabajando muy bien:

    litMessage.Text = messageBody.Replace(Environment.NewLine, "<br/>")

    Aunque todavía no estoy seguro de por qué los saltos de línea fueron aún se muestra correctamente cuando se utiliza el pre etiqueta o incluso mostrar el valor recuperado mediante un alert de javascript cuadro.

    UpdatePanel utiliza peticiones AJAX. Van a enviar las etiquetas codificadas a través de ajax como texto sin formato cuando se descifran. esta es la razón por la que no había saltos de línea como la que aplasta todo en 1 línea para disminuir el tamaño de la llamada ajax

    OriginalEl autor nullexception

  2. 3

    Es difícil decir desde el código que has publicado, pero si vas a pasar el myString varaible sí mismo a la página (y no el valor de retorno de la Replace función) usted necesitará hacer –

    myString = myString.Replace(Environment.NewLine, "<br/>")

    antes de pasar a la página.

    Gracias por tu respuesta. Me fui y volver a verificar el código y es similar a su sugerencia. He editado mi pregunta para ser más claros.

    OriginalEl autor ipr101

  3. 3

    Si el uso de un UPDATEPANEL la myText..Replace(Environment.NewLine, "<br/>") NO funcionará. Me enteré de la manera difícil (pasó de 2 horas ya)

    La solución (cuando se utiliza un updatepanel) es la de establecer un «PostBackTrigger» como este:

    <asp:UpdatePanel runat="server" ID="pnlUpdate" UpdateMode="Conditional">
    
    <Triggers>
    <asp:PostBackTrigger ControlID="btnDoThatShitAlready" />
    </Triggers>

    OriginalEl autor Robert

  4. 2

    Acabo de encontrar esta, mientras busca una solución para reemplazar a no trabajar con texto en el control literal, mientras que reside dentro de un formview. La forma en que lo resuelto fue, en el enlace de datos para el literal, para pasar el texto a una cadena, hacer la reemplace en la cadena, a continuación, poner el texto procesado de nuevo en el literal del campo de texto.

    Protected Sub MyLit_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
        Dim text1 As String
        text1 = CType(myFormView.FindControl("MyLit"), Literal).Text
        text1 = Replace(text1, Environment.NewLine, "<br />")
        CType(myFormView.FindControl("MyLit"), Literal).Text = text1
    End Sub

    Espero que esta ayuda para usted y cualquier otra persona que visite este sitio para obtener una solución.

    OriginalEl autor Atrius

  5. 2

    Sobre las 4 pruebas anteriores que fracasaron (autor: nullexception)…

    MsgBox(textbox.Text.Contains(vbCr))
    MsgBox(textbox.Text.Contains(vbCrLf))
    MsgBox(textbox.Text.Contains(vbNewLine))
    MsgBox(textbox.Text.Contains(Environment.Newline))

    Traté de esas pruebas y no para mí. Entonces, me di cuenta de que no había prueba por sólo vbLf, así que he probado. BINGO! Eso fue todo!

    Así, esto funciona

    Label.Text = MultiLineTextBox.Text.Replace(ControlChars.Lf, "<br />")

    OriginalEl autor Hal Driver

  6. 1

    Usted puede utilizar esto así, porque el System.NewLine devuelve un "\r\n" cadena
    dim messageBody as string = «texto»;

    litMessage.Text = messageBody.Replace("\r\n", "< br />");
    La Mejor Práctica es utilizar el Ambiente.Salto de línea en lugar de la codificación de \r\n directamente. Esto hace que el código sea mucho más portátil.

    OriginalEl autor Nudier Mena

  7. 1

    litMessage.Text = messageBody.Replace("\\\\n","< br />").Replace(Environment.NewLine, "< br />")

    Se ha trabajado para mí. Espero que esto podría funcionar para usted también.

    OriginalEl autor Raju

  8. 1

    He perdido mis dos horas de encontrar lo que estaba realmente mal.
    Bien, la solución es en lugar de medio Ambiente.Salto de línea, utilice ControlChars.Lf

    Puede quitar updatepanel que va a resolver el problema para el futuro de los datos. Pero si usted ya tiene algunos datos, el uso de ControlChars.Lf le ayudará.

    OriginalEl autor Gunjesh Kumar

  9. 0
    var str = "Text sample to replace carriage return + newline ("
    + (char)13 + (char)10 
    + @") and
    the Environment.NewLine and " 
    + Environment.NewLine
    + " and the unix \n new line character.";
    
    str.Replace("\r\n","<br />")
           .Replace(Environment.NewLine, "<br />")
           .Replace("\n", "<br />");

    La salida es

    Text sample to replace carriage return + newline (<br />) and<br />  the Environment.NewLine and <br /> and the unix <br /> new line character.
    Medio ambiente.NewLine correctamente determina el Caracter de fin de línea tipo de uso para el sistema de host (Windows \r\n o Unix \n) no es un salto de Línea tipo en y de sí mismo.
    Pero, ¿y si viene el texto a través de internet, y el servidor no sabe que \n es para el salto de Línea en el lado del cliente. Esta es la razón por la Reemplace el medio Ambiente.NewLine, «<br />») no, me refiero medio Ambiente.NewLine es para el lado del servidor de la nueva línea, no del cliente. Los clientes enviar (char)13 + (char)10 o \n o el texto puede ser cambiado a través de código con el medio Ambiente.NewLine. Estoy de acuerdo en el uso de todos en el mismo bloque es redundante, pero no creo que sea de otra manera

    OriginalEl autor Adrian Iftode

  10. 0

    A poner la etiqueta de texto de la siguiente línea, podemos utilizar las que se mencionan a continuación solución.

    <asp:Label ID="lblAppointmentLocation" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Location").ToString().Replace(Environment.NewLine, "<br/>").Replace("\n", "<br />") %>'></asp:Label>

    OriginalEl autor Dayakar

  11. 0

    Lo que realmente estás buscando es:

    @Html.Raw(@Regex.Replace(input_to_be_printed_correctly, @"\r\n?|\n", "<br />"))

    OriginalEl autor Enter The Void

  12. 0

    Estoy usando este código y funciona :
    En lugar de

    .Replace(Environment.NewLine, "<br/>")

    uso

    .Replace("\n", "<br />")

    La esperanza de ser útiles.

    OriginalEl autor ali mahmoodi

Dejar respuesta

Please enter your comment!
Please enter your name here