takachaa / .net-Framework

0 stars 0 forks source link

【Webフォーム】AutoPostBackについて #19

Open takachaa opened 6 years ago

takachaa commented 6 years ago

AutoPostBackの基本

以下のようにTextBox2にAutoPostBackを設定した場合は

<form id="form1" runat="server">
        <p>
            <asp:Label ID="Label1" runat="server" Text="Label1"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server" Height="19px" AutoPostBack="True" ontextchanged="TextBox1_TextChanged"></asp:TextBox>
         </p>
         <p>
            <asp:Label ID="Label2" runat="server" Text="Label2"></asp:Label>
            <asp:TextBox ID="TextBox2" runat="server" Height="19px"></asp:TextBox>
        </p>
        <p>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </p>
    </form>

以下のようにコードビハインド側でメソッドを実装してテキストが変更されたたら以下のメソッドが呼ばれることになる。

 protected void TextBox1_TextChanged(object sender, EventArgs e)
 {
            Label1.Text = TextBox1.Text;
 }

参考URL http://asp.popotoo.com/21

takachaa commented 6 years ago

AutoPostBack バリデーションのかけ方

以下のようにAutoPostBackをかけたテキストボックスにバリデーション(空白だめ)をかけてみたい

<form id="form1" runat="server">
        <p>
            <asp:Label ID="Label1" runat="server" Text="Label1"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server" Height="19px" AutoPostBack="TRUE" ontextchanged="TextBox1_TextChanged"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="値を入力してください" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
         </p>
         <p>
            <asp:Label ID="Label2" runat="server" Text="Label2"></asp:Label>
            <asp:TextBox ID="TextBox2" runat="server" Height="19px"></asp:TextBox>
        </p>
        <p>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </p>
</form>

コードビハインドは以下のように記述する

 public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                Page.Validate();
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                Label1.Text = TextBox1.Text;
                Label2.Text = TextBox2.Text;
            }

        }

        protected void TextBox1_TextChanged(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                Label1.Text = TextBox1.Text;
            }
        }
    }   

補足 有効な検証コントロールを切り替える http://www.atmarkit.co.jp/fdotnet/dotnettips/251aspdisablevalid/aspdisablevalid.html

takachaa commented 6 years ago

POSTBACKの基本

参考 https://www.ipentec.com/document/document.aspx?page=csharp-asp-net-disabled-viewstate

takachaa commented 6 years ago

POSTBACKとVIEWSTATEの謎

まず、コントロール単位で ViewState を使用しない宣言をする EnableViewState= false にしていた場合、基本的には初期値(デザイン時の設定)に戻る。 ただし、戻らないで設定された値が残ったままになる項目もある。 それがWebフォームコントロールでいうところの以下。

  TextBox.Text   CheckBox.Checked   RadioButton.Checked (ただし GroupName を付けていた場合に限る。単独のものは消える)   CheckBoxList.SelectedIndex   RadioButtonList.SelectedIndex

つまり HTMLフォームに置き換えて考えたときの一般的な入力項目は基本的には残るようだ。 (ただし、これはもしかしたらブラウザに依存するものもあるかもしれない)

これに対して、以下のような Webフォーム専用の項目が初期化される。

  Label.Text   CheckBox.Text   RadioButtonList.Items   DropDownList.Items    等々・・・

参考 http://www.ilovex.co.jp/Division/ITD/archives/2004/11/aspnet_web_1.html

真実はこうだった

66595

POSTBACKとは

 ページ遷移(同じページ)がおこっても入力された値を保持する仕組み

ViewState

 元の値を保持しておく仕組み

上記二つは全く別のものである。

だからViewStateを無効にしてもPostBackは普通に行われるのである。