ASP.NET の TextBox コントロールで ReadOnly プロパティを有効にすることで入力制限を行うことができます。なお、ReadOnly プロパティを True にした場合には、ユーザー操作による操作はできませんが、Javascript からは変更できます。
スポンサーリンク
ただし、変更した内容をサーバ側で受け取ることはできません。この点に留意しておかなければいけません。以下に検証を行ったサンプルコードを掲載します。詳細はサンプル中のコメントを参照ください。
ASPX
<form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server" ReadOnly="True">original text</asp:TextBox> <asp:Button ID="Button1" runat="server" Text="TextChange" /> <asp:Button ID="Button2" runat="server" Text="PostBack" /> </div> </form>
VB.NET
''' ページロード Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If (IsPostBack = True) Then Return ' ボタン1にテキスト変更用のスクリプトを設定する Dim script As String script = "getElementById('" + TextBox1.ClientID + "').value = 'update text'; return false;" Button1.Attributes.Add("onclick", script) End Sub ''' Button2 クリックによるポストバック Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click Dim text As String = TextBox1.Text ' テキストボックスが ReadOnly の場合、ブラウザ側(Javascript)で ' 編集してもクリックイベントでは元の値が取得される End Sub
C#
/// ページロード protected void Page_Load(object sender, EventArgs e) { if (IsPostBack == true) { return; } // ボタン1にテキスト変更用のスクリプトを設定する string script; script = "getElementById('" + TextBox1.ClientID + "').value = 'update text'; return false;"; Button1.Attributes.Add("onclick", script); } /// Button2 クリック(ポストバック) protected void Button2_Click(object sender, EventArgs e) { string text = TextBox1.Text; // テキストボックスが ReadOnly の場合、ブラウザ側(Javascript)で // 編集してもクリックイベントでは元の値が取得される }
制約を回避したい場合
どうしてもこの制約を回避したい場合は、TextBox の ReadOnly プロパティを無効にして、ページロード( Page_Load )イベントで以下のように readonly 属性を直接埋め込みます。これで、Javascript での修正内容がポストバック時にサーバ側で取得できるようになります。
サンプルコード(変更点のみ)
ASPX
<asp:TextBox ID="TextBox1" runat="server" ReadOnly="False">original text</asp:TextBox>
VB.NET
' 直接属性を追加する TextBox1.Attributes.Add("readonly", "true")
C#
// 直接属性を追加する TextBox1.Attributes.Add("readonly", "true");
ただし、下記の参考リンクに記載のあるとおり、セキュリティ上の観点からは推奨できません。
参考
この例には、ユーザー入力を受け付けるテキスト ボックスがあります。これにより、セキュリティが脆弱になる可能性があります。既定では、ASP.NET Web ページによって、ユーザー入力にスクリプトまたは HTML 要素が含まれていないかどうかが検証されます。詳細については、「スクリプトによる攻略の概要」を参照してください。