[ ASP.NET ] asp:TextBox コントロールを ReadOnly にする

Pocket

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 要素が含まれていないかどうかが検証されます。詳細については、「スクリプトによる攻略の概要」を参照してください。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *