ASP.NET中的ReadOnly = true和TextBox1.Attributes.Add(" readonly"," readonly")有什么区别?

时间:2016-03-15 09:31:28

标签: c# asp.net

我有一个文本框,我只读它但想要回发它的值。之前我将代码设置为:

<asp:TextBox ID="textbox1" runat="server" ReadOnly="true">/asp:TextBox>

没用。我删除了ReadOnly="true",在代码中我添加了以下行

txtContractStartDate.Attributes.Add("readonly", "readonly");

为什么要开始回发数据?

2 个答案:

答案 0 :(得分:3)

ReadOnly属性设置为true 包括 the attribute being set

if (ReadOnly) {
    writer.AddAttribute(HtmlTextWriterAttribute.ReadOnly, "readonly");
}

但是,该属性也会影响回发行为。它只会在not readonly(原始代码缩短)时保存处于视图状态的文本:

private bool SaveTextViewState {
    get {
        if (TextMode == TextBoxMode.Password) {
            return false;
        }
        if (Events[EventTextChanged] != null || !IsEnabled || !Visible || (ReadOnly) || this.GetType() != typeof(TextBox)) {
            return true;
        }
        return false;
    }
}

在这种情况下,控件也只会尝试to restore it

protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
    // …

    if (!ReadOnly && !current.Equals(postData, StringComparison.Ordinal)) {
        Text = postData;
        return true;
    }
    return false;
}

答案 1 :(得分:1)

来自MSDN论坛:

  

当你设置readonly属性时,asp.net知道你已经标记了   作为只读控制并改变控件的行为方式 - 它会   将readonly html属性添加到呈现的控件并赢得了   回发上的流程输入。当您通过属性.net执行此操作时   简单地将其视为属性,没有特殊的逻辑   导致.net到&#34;锻炼&#34;你添加的属性意味着它   应该改变控件的属性。基本上

txtdate.Attributes.Add("readonly", 'true');
     

与.net相比没有什么不同

txtdate.Attributes.Add("ABC", 'DEF');
     

您的属性代码会添加&#34; readonly&#34;属性所以它的行为就像   你期望在页面上,但因为.net ReadOnly属性没有   已设置,.net不会修改控件在回发时的行为方式。

     

类似的事情发生在文本框设置为密码模式。您可以   通过.Text设置任何你想要的东西,但文本框不会渲染值   因为.net改变了控件在其模式设置为时的行为方式   密码。您可以通过添加&#34;值&#34;来规避这一点。属性   这样,并设置&#34;值&#34;是密码。