【问题标题】:Multiline textbox - spaces added to beginning on postback多行文本框 - 在回发时添加到开头的空格
【发布时间】:2014-07-08 04:39:45
【问题描述】:

我将Textbox 添加到.ascx 控制页面,如下所示:

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

第一次加载时会显示如下内容(包括开头的 4 个空格):

    Description goes here

简单地说,它是一个有 2 行的 Multiline Textbox。但是,每当我们对服务器执行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 的开头?

【问题讨论】:

  • 除了您最后提到的 hack,您通常如何填充此文本框的文本?
  • 您在此文本框中从哪里输入值?
  • 您可以使用 Trim 功能删除空格,但我会先找到空格的来源。就像以前添加 cmets 的人一样,我怀疑当您加载文本框时这些空格被放在那里。
  • @Dan-o & Jalpesh Vadgama - 我们几乎所有的文本都是通过 postgres 连接从数据库中的字符串加载的,通常通过 DataReader 访问。在某些情况下,我们的应用程序没有使用默认值初始化多行文本框,但会出现同样的问题 - 在开始时添加了 4 个空格。普通文本框(单行)不受影响。
  • @CraigMoore - 就是这样 - 我们无法找出这些空间的来源。使用 Trim() 似乎删除了除前 4 个空格之外的所有空格。

标签: c# asp.net mono


【解决方案1】:

我也有同样的问题。要删除多余的空格,请使用 textbox_TextChanged 事件并将其绑定到文本框。

protected void txtDescription_TextChanged(object sender, EventArgs e)
{
String strReplace = Regex.Replace(txtDescription.Text.Trim(),@"\t|\n|\r","");
txtDescription.Text = strReplace;
}

将 TextChanged 事件绑定到文本框:

注意:它不会删除第一个空格,但会与回发的后续空格一起使用。

【讨论】:

    【解决方案2】:

    我也遇到过这个问题。可能是单声道 asp.net 错误。

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

    它与 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 { };
    }
    

    【讨论】:

    • 抱歉回复晚了,刚刚才抽空测试一下。第一次测试证明是有希望的。将进行更多测试,如果一切正常,我会将其标记为已接受。
    【解决方案3】:

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

    <textarea>This is some content</textarea>
    

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

    <textarea>
        This is some content
    </textarea>
    

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

    我不熟悉您(ASP Web 表单)如何生成您的内容,但这应该可以让您进行调查。

    【讨论】:

    • 这就是页面源显示的内容(除了结束标记位于第二行的末尾。可能会尝试创建一个自定义多行文本框控件并覆盖渲染函数,看看它是否是一个错误那里。否则,调查可能需要比我们公司目前能够腾出的更多时间。
    • 您可以在 sql 中轻松修复它。 SELECT LTRIM(RTRIM(Column_Name)) AS Column_Name FROM Table_Name WHERE ....
    【解决方案4】:

    您唯一的选择是对代码进行断点并查看它们的出现位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2021-10-22
      • 2014-04-17
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多