C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ポストバックの情報保持

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■86049 / inTopicNo.1)  ポストバックの情報保持
  
□投稿者/ たまたま (1回)-(2017/12/14(Thu) 16:44:01)

分類:[ASP.NET (C#)] 

以下のようなコードを記述するとポストバックで情報が保持されません。
<%
for (var i = 0; i < 10; i++ )
{
Response.Write("<input type=\"text\" id=\"test" + i + "\" name=\"test" + i + "\" runat=\"server\"/>");
}
%>

以下のコードでは保持されました。
<input type="text" id="test" name="test" runat="server"/>

Response.Write中のHTMLについてはrunat="server"が評価されない事が原因と思いますが
Response.Writeで記述したコントロールに対しても情報を保持されるようにする事は出来ないでしょうか。

よろしくお願いします。
引用返信 編集キー/
■86051 / inTopicNo.2)  Re[1]: ポストバックの情報保持
□投稿者/ ぽぴ王子 (52回)-(2017/12/14(Thu) 17:20:13)
ぽぴ王子 さんの Web サイト
No86049 (たまたま さん) に返信
> 以下のようなコードを記述するとポストバックで情報が保持されません。
>         <%
>             for (var i = 0; i < 10; i++ )
>             {
>                 Response.Write("<input type=\"text\" id=\"test" + i + "\" name=\"test" + i + "\" runat=\"server\"/>");
>             }
>         %>
> 
> 以下のコードでは保持されました。
>         <input type="text" id="test" name="test" runat="server"/>
> 
> Response.Write中のHTMLについてはrunat="server"が評価されない事が原因と思いますが
> Response.Writeで記述したコントロールに対しても情報を保持されるようにする事は出来ないでしょうか。

最近は ASP.NET MVC しか触っていないので、ちょっとうろ覚えの回答になってしまいますが。
ASP.NET が出力した HTML コードを見ていただくとわかると思うのですが(ブラウザでソースを見る感じです)
Visual Studio 上で
<input type="text" id="test" name="test" runat="server"/>
と書いたコードは、HTML 上ではそのまま表示されているわけではないかと思います。
(少なくとも runat="server" の部分はなくなっているか、何か別のものになっているかと)

runat="server" が付加された HTML は ASP.NET 内でいったんサーバーコントロールとして認識され、その上で
HTML として出力されます。そうすることで、ポストバック情報も保持されるようになります。
なので、上のほうの書き方では『クライアント側で』『直接 HTML として』出力されているため、ポストバック
情報が保持されないのです。

ではどうすればいいかというと、サーバーコントロールとして認識してもらうように、サーバー側でコントロール
を追加してあげる必要があります。

https://msdn.microsoft.com/ja-jp/library/kyt0fzt1%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396

ちょっと検索して(僕には)わかりやすそうな解説が出てきましたが、これでどうでしょうか。
わからないところがあれば、また質問してみてください。

引用返信 編集キー/
■86052 / inTopicNo.3)  Re[1]: ポストバックの情報保持
□投稿者/ WebSurfer (1400回)-(2017/12/14(Thu) 18:02:04)
No86049 (たまたま さん) に返信

> Response.Writeで記述したコントロールに対しても情報を保持されるようにする事は出来ないでしょうか。

できません。

ウラワザ的なことはできるかもしれませんが、そんなことを考える前に何か手はあるのでは?

何をしたいのか、全体的なシナリオ・ストーリーを書いてもらえれば代案が出せるかもしれません。

その際は、あなたの開発環境(OS, .NET, IIS, Visual Studio のバージョン、ブラウザは何かなどの情報)
も書いてください。質問するときのイロハのイですよ。

引用返信 編集キー/
■86053 / inTopicNo.4)  Re[2]: ポストバックの情報保持
□投稿者/ たまたま (2回)-(2017/12/14(Thu) 18:03:21)
ありがとうございます。

以下のコードで解決できました。
protected void Page_Load(object sender, EventArgs e)
{
for (var i = 0; i < 10; i++)
{
TextBox textbox = new TextBox();
textbox.ID = "text_" + i;
holder.Controls.Add(textbox);
}
}

<asp:PlaceHolder runat="server" ID="holder"/>

お世話になりました。
解決済み
引用返信 編集キー/
■86054 / inTopicNo.5)  Re[3]: ポストバックの情報保持
□投稿者/ WebSurfer (1401回)-(2017/12/14(Thu) 18:16:24)
No86053 (たまたま さん) に返信

動的にサーバーコントロールを追加するのであれば、Page_Load ではなく Page_Init で行う
のがお勧めです。

ViewSate のロード、POST データのロード、イベントの起動を考えると Page_Load は遅すぎる
可能性もありますので。

あと、動的に生成・追加したサーバーコントロールは、ポストバックの際にも同様に生成・追加
する必要があるので注意してください。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ