多行文本框 - 在回发时添加的空格

时间:2014-05-20 04:22:41

标签: c# asp.net mono

我在Textbox控件页面添加了.ascx,如下所示:

<asp:TextBox id="txtDescription" runat="server" Width="500" TextMode="MultiLine" Rows="2"></asp:TextBox>

首次加载时会显示类似的东西(包括开头的4个空格):

    Description goes here

简单地说,它是Multiline Textbox,有2行。但是,无论何时我们对服务器执行Postback,当页面重新加载时,我们都会得到:

        Description goes here

另一个Postback

            Description goes here

等等。基本上,每次在Postback之后刷新页面时,它会在文本框的开头添加4个空格。在某些页面上,这不是问题,但是,如果用户在Gridview或其他Control中输入了大量数据,则Textbox的内容可能会结束向右分流20个左右的字符,有时超出Textbox的范围。

简单地说,这对我们公司来说是一个问题,因为它发生在我们所有的网页上。我们的一位客户多次通过“......你能否在某些时候对文本框开头的空格做些什么?”

现在,我们使用的临时修复程序是PageLoad函数中的以下代码,但是,Textbox的开头仍有4个空格。在100 .ascx.aspx个控件/页面中滚动它并不是一个真正的解决方案。

if (IsPostBack)
     txtDescription.Text = txtDescription.Text;

现在最大的问题是,有没有人知道如何删除这些神秘的4个空格,这些空间一直被添加到Multiline Textbox的开头?

3 个答案:

答案 0 :(得分:4)

典型的html textarea(多行文本框)如下所示:

<textarea>This is some content</textarea>

现在,如果您的输出如下:

<textarea>
    This is some content
</textarea>

然后你将介绍你的空间问题。 保存此内容后,您将在开头获得4个空格(缩进)。现在你重新加载这4个空格,突然你有8个空格:标记为4,保存内容为4。每次保存内容时,此模式都会继续。

我不熟悉您(ASP Web窗体)如何生成您的内容,但这应该给您一个调查点。

答案 1 :(得分:1)

我也遇到了这个问题。可能是mono asp.net bug。

这是我找到的方式, 构建自定义服务器控件以替换多行文本框。

使用asp.net集成验证框架。

有人有更好的主意吗?

[ValidationProperty("Text")]
[ControlValueProperty("Text")]
[DefaultProperty("Text")]
public class TextArea: WebControl, IPostBackDataHandler, IEditableTextControl
{
    protected override HtmlTextWriterTag TagKey
    {
        get { return HtmlTextWriterTag.Textarea; }
    }

    public bool CausesValidation
    {
        get
        {
            if (ViewState["CausesValidation"] == null)
                return false;
            return (bool)ViewState["CausesValidation"];
        }
        set
        {
            ViewState["CausesValidation"] = value;
        }
    }

    public string ValidationGroup
    {
        get
        {
            return (string)ViewState["ValidationGroup"] ?? "";
        }
        set
        {
            ViewState["ValidationGroup"] = value;
        }
    }

    public string Text
    {
        get
        {
            return (string)ViewState["Text"] ?? "";
        }
        set
        {
            ViewState["Text"] = value;
        }
    }

    public bool ReadOnly
    {
        get
        {
            if (ViewState["Readonly"] == null)
                return false;

            return (bool)ViewState["Readonly"];
        }
        set
        {
            ViewState["Readonly"] = value;
        }
    }

    public int Rows
    {
        get
        {
            if (ViewState["Rows"] == null)
                return 0;
            return (int)ViewState["Rows"];
        }
        set
        {
            ViewState["Rows"] = value;
        }
    }

    public int Columns
    {
        get
        {
            if (ViewState["Columns"] == null)
                return 0;
            return (int)ViewState["Columns"];
        }
        set
        {
            ViewState["Columns"] = value;
        }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID);

        if (Enabled && !IsEnabled)
            writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");
        if (ReadOnly)
            writer.AddAttribute(HtmlTextWriterAttribute.ReadOnly, "readonly");

        if (Rows != 0)
            writer.AddAttribute(HtmlTextWriterAttribute.Rows, Rows.ToString(NumberFormatInfo.InvariantInfo));
        if (Columns != 0)
            writer.AddAttribute(HtmlTextWriterAttribute.Cols, Columns.ToString(NumberFormatInfo.InvariantInfo));

        base.AddAttributesToRender(writer);
    }

    public override void RenderControl(HtmlTextWriter writer)
    {
        RenderBeginTag(writer);
        writer.WriteEncodedText(Text);
        RenderEndTag(writer);
    }

    public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
        var strPostBack = postCollection[postDataKey];
        if (ReadOnly || Text.Equals(strPostBack, StringComparison.Ordinal))
            return false;
        Text = strPostBack;
        return true;
    }

    public void RaisePostDataChangedEvent()
    {
        if (!Page.IsPostBackEventControlRegistered)
        {
            Page.AutoPostBackControl = this;
            if (CausesValidation)
                Page.Validate(ValidationGroup);
        }
        TextChanged(this, EventArgs.Empty);
    }

    public event EventHandler TextChanged = delegate { };
}

答案 2 :(得分:-1)

您唯一的选择是断开代码并查看它们的显示位置。