Pergunta

Eu tenho o seguinte formulário da web:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
    Inherits="TestWebApp.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtMultiLine" runat="server" 
            Width="400px" Height="300px" TextMode="MultiLine"></asp:TextBox>
        <br />
        <asp:Button ID="btnSubmit" runat="server" 
            Text="Do A Postback" OnClick="btnSubmitClick" />
    </div>
    </form>
</body>
</html>

e cada vez que eu posto de volta, os feeds de linha principais na caixa de texto são removidos.Existe alguma maneira de evitar esse comportamento?

Eu estava pensando em criar um controle personalizado herdado da caixa de texto, mas queria fazer uma verificação de integridade aqui primeiro.

Foi útil?

Solução

Acabei fazendo o seguinte no btnSubmitClick()

public void btnSubmitClick(object sender, EventArgs e)
{
    if (this.txtMultiLine.Text.StartsWith("\r\n"))
    {
        this.txtMultiLine.Text = "\r\n" + this.txtMultiLine.Text;
    }
}

Devo estar muito cansado ou doente ou algo assim.

Outras dicas

Acho que o problema aqui está na maneira como o navegador renderiza o conteúdo da área de texto, e não no ASP.NET em si.Fazendo isso:

public void btnSubmitClick(object sender, EventArgs e) {
  this.txtMultiLine.Text = "\r\n" + this.txtMultiLine.Text;
}

permitirá que você alcance a saída de tela desejada, mas adicionará uma nova linha extra ao texto que o usuário não inseriu.

A solução ideal seria que o controle TextBox no ASP.NET sempre escrevesse a nova linha DEPOIS de escrever a tag aberta e ANTES de escrever o conteúdo do Texto.Dessa forma, você alcançaria o efeito desejado sem superar o conteúdo da caixa de texto.

Poderíamos herdar de TextBox e corrigir isso substituindo RenderBeginTag:

public override void RenderBeginTag(HtmlTextWriter writer) {
  base.RenderBeginTag(writer);
  if (this.TextMode == TextBoxMode.MultiLine) {
    writer.Write("\r\n"); // or Environment.NewLine
  }
}

Agora, criar uma nova classe para esse pequeno problema parece um exagero, então sua abordagem pragmática é completamente aceitável.Mas eu mudaria para rodar no evento PreRender da página, que está bem atrasado no ciclo de vida da página e não interferiria no processamento do texto enviado no evento OnSubmit do botão:

protected void Page_Load(object sender, EventArgs e) {
  this.PreRender += Page_OnPreRender;
}
protected void Page_OnPreRender(object sender, EventArgs e) {
  this.txtMultiLine.Text = "\r\n" + this.txtMultiLine.Text;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top