我在一个与日历扩展程序一起使用的页面上的文本框遇到了一些严重问题,如下所示:
<asp:TextBox ID="fnTB" runat="server" ReadOnly="True"></asp:TextBox>
<asp:CalendarExtender ID="TextBox1_CalendarExtender" runat="server"
Enabled="True" TargetControlID="fnTB" DefaultView="Years"></asp:CalendarExtender>
现在,问题是由&#34; ReadOnly&#34;属性。由于我的业务逻辑对日期进行了一些验证,因此对日期的格式非常严格,因此我将文本框设置为只读,以防止用户弄乱日期的格式。问题是,现在将此属性设置为true
,textbox.Text
属性始终设置为""
。
根据我在微软论坛上发现的关于这个属性的内容,它说
服务器不对只读文本框进行处理。这可以防止恶意用户更改只读的Text值。除非由服务器端代码
修改,否则Text属性的值将保留在回发之间的视图状态中
然后他们建议使用contentEditable
属性。问题是此属性仅适用于IE浏览器,这不是我们所需要的,因为用户必须能够从任何浏览器访问该网站。
所以我想知道是否有办法在不使用此属性的情况下执行此操作。
提前感谢您的帮助!
答案 0 :(得分:2)
如果您确实希望只读字段通过绑定公开数据,我建议您使用Label来描述或代表另一个控件。
<asp:Label ID="fnTB" runat="server"></asp:Label>
或者,如果您只需要显示不可编辑的文本,则可以使用带有文字的范围。
<span class="foo"><asp:Literal id="fnTB" runa="server" /></span>
答案 1 :(得分:2)
答案是不要将此字段设为只读,而是允许对其进行编辑并添加适当的验证以确保其格式正确。
要扩展一点,将UI控件设置为只读或禁用仍然不会阻止确定( cough firebug cough )的人更改内容。而且你遇到了上面提到的问题。
输入应该始终进行验证,没有例外。
答案 2 :(得分:0)
您可以添加OnTextChanged事件。
<asp:TextBox ID="fnTB" runat="server" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
当您计划设置值时,您可以禁用该事件。在事件处理程序中,您可以忽略任何更改,以便文本框基本上是只读的。
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
e.Handled = true; // Ignore any input.
}
答案 3 :(得分:0)
最简单的答案是Enabled='false'
<asp:TextBox ID="fnTB" runat="server" Enabled="false" />
这将以这种方式呈现控件:
<input name="fnTB" type="text" id="fnTB" disabled="disabled" class="aspNetDisabled">
您仍然可以为其分配值并在回发时检索值,但用户将无法输入此字段。但是当然你仍然需要考虑这个问题的安全隐患(即它的价值很容易通过检查员/萤火虫来改变)。