VS2010 カスタムコントローラで値が-1になる問題

このQ&Aのポイント
  • Visual Studio 2010および.NET 4.0で開発しています。カスタムコントローラーにて、特定の値を元にデータベースからリストデータを取得し、画面表示時に自動的にアイテムを追加する方法を探しています。しかし、submitさせると、値が-1になってしまう問題が発生しています。
  • RenderまたはRenderContentsメソッドを使用してアイテムを追加しましたが、submitさせると、選択されたインデックスが必ず-1になります。ViewStateに値が反映されていない可能性があるので、解決方法を教えてください。
  • 問題の根本的な原因がViewStateにあるのかどうかを確認する必要があります。もしそうであれば、ViewStateを正しく設定する方法や、他の代替方法を試してみることができます。
回答を見る
  • ベストアンサー

VS2010 カスタムコントローラだと値が…

見てくださりありがとうございます。 VisualStudio2010/.NET4.0で開発しています。 やりたい事  <%@ Register assembly="XXX" namespace="XXX" tagprefix="custom" %>  <custom:DropDownListNew id="hogehoge" runat="server" code="100" />  カスタムコントローラーにて、codeの値を元にDataBaseから登録されているリストデータを取得し  Items.Addされた状態で画面が表示させたいと考えていました。  (各Page_Loadにてリストを作るのではなくし楽させたい) 困った事  submitさせた時にhogehoge.SelectIndexが必ず-1になってしまう。  DB部分は省略してRender、もしくはRenderContentsにて   Items.Add(new ListItem("hoge1", "1"));  としても表示は出来てもsubmitさせたときにhogehoge.SelectIndexが必ず-1になってしまう。     protected override void Render(HtmlTextWriter writer)   {    Items.Add(new ListItem("hoge1", "1"));    Items.Add(new ListItem("hoge2", "2"));    base.Render(writer);   }  ViewStateに反映されていないという事なのでしょうか?  よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

>(各Page_Loadにてリストを作るのではなくし楽させたい) であれば、ControlのLoadイベントもしくは、OnLoadメソッドのオーバーライドにて実装する。 >protected override void Render(HtmlTextWriter writer) >ViewStateに反映されていないという事なのでしょうか? SaveStateCompleteが終わっているので。 ASP.NET ページのライフ サイクルの概要 http://msdn.microsoft.com/ja-jp/library/ms178472(VS.80).aspx

arisutoteresu
質問者

お礼

参考にさせていただきました。 ありがとうございます。 >SaveStateComplete終わっているので そういう事だったのですね。 参考になりました。

その他の回答 (1)

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

表示したページ内でドロップダウンリストの内容を選択していても、submit後にSelectIndexが-1に なるのでしょうか? 選択していない場合はそうなるような気もしますが。 あと、カスタムコントローラとしてどのようなプログラムを記述しているかによる部分のような 気がします。 コントローラのつくりかたで、どこまでの機能を自分で実装しないといけないかは異なるはず。 そもそもユーザーコントローラとして作成したのでもよさそうな気もします。

arisutoteresu
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • BC30002: 型 'ListItem' が定義されていません となり動きません

    ASP初心者です。 ASP.NET2.0でドロップダウンリストに以下のコードでitemを追加しようとすると「コンパイル エラー メッセージ: BC30002: 型 'ListItem' が定義されていません。」となり動きません。当初はうまく動いていたのですが、サイトのファイルすべてをアップロードし直してから動かなくなりました。 初心者ゆえコードが悪いのか、IISに問題があるのかさっぱりわかりません。どなたかお教えいただけませんでしょうか。 よろしくお願いいたします。 ------------------------------------------------- Dim i as Integer Dim liitem As ListItem 'ここでエラーになります For i = 1 To 15 liitem = New ListItem liitem.Text = i liitem.Value = i+100 Me.DropDownList.Items.Add(liitem) Next i 変数を宣言せず Me.DropDownList.Items.Add(New ListItem(i, i+100)) として追加しようとしても同じでした。 よろしくお願いいたします。

  • literalのエラーについて

    javascriptで質問があります。 ---プログラム--- html = <a href="javascript:hogehoge('" + items + "')>hoge</a>"; ------- 上のようにリンクを張ってhogehoge()を実行させたいんですが、itemsがobjectなので以下のようなエラーが出てしまいます。 missing ] after element list [Break on this error] hogehoge([object これをどうすれば解決できるでしょうか。よろしくお願い致します。

  • 送信ボタンを押して別ウィンドウを立ち上げるとき大きさを指定したい

    こんにちわ, 今HTMLの学習をしています。 今Submitボタンを押してtargetをnewにすると新しいウィンドウが立ち上がることはわかったのですが,その大きさを指定するにはどうすればよろしいのでしょうか。 javascriptなどのwindowopenを使用して値等を送信できるのでしょうか。 たとえば, <form action="hoge.php" method="POST" target="new"> <input type="hidden" name="hoge2" value="hogehoge"> : </form> などとかいてhoge.phpにhoge2の値・・・などを送って新しいウィンドウを立ち上げたいときです。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • [C#]Arraylistに追加した構造体の内容の変更

    struct Hoge {     public string name;     public string address; } ArrayList list = new ArrayList(); Hoge test = new Hoge(); test.name = "あいうえお"; test.address = "123"; list.Add(test); test.name = "かきくけこ"; test.address = "456"; list.Add(test); //ここから //list[0].name = "さしすせそ"; のように追加するコードを書きたいです //ここに for (int i = 0; i < List.Count; i++) {     MessageBox.Show((Hoge)List[i]).name.ToString()); } これで、 list[0]のnameには"あいうえお" list[1]のnameには"かきくけこ" が、代入されていますが list[0]のnameをArrayListに追加したあとに変更したいのです。 このままだと、「あいうえお」「かきくけこ」と表示されますが、 「さしすせそ」を途中でlist[0]の代入して、 「さしすせそ」「かきくけこ」と表示したいのです。

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • webサービスの結果をjsonで表示したい

    asp.netでwebサービスを作成する際、結果ページを「json」で返したいのですが、 なぜか、xmlで出力されてしまいます。 [WebMethod()] [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] public List<hogehoge> GetHogeJson() { List<hogehoge> hogeList = new List<hogehoge>(); ・・・ hogeList.Add(hogeEntity); return hogeList; } と、ResponseFormat = ResponseFormat.Jsonを指定しているのですが、 出力がXMLとなってしまいます。 設定が足りないのでしょうか?

  • Java オブジェクトのコピーについて

    Java オブジェクトのコピーについて 現在、Javaの勉強を行っているのですが、 オブジェクトのコピーについてどうしてもわからない部分があります。 以下についてご教授お願いいたします。 ----------------------------- (型定義) public class TypeAB{   List<String[]> ab = new ArrayList<String[]>;   public List<String[]> getAb(){     return ab;   }   public setAb(List<String[]> ab){     this.ab = ab;   } } ------------------------------ public class mst{   private void function(){     TypeAB hoge1 = new TypeAB();     TypeAB hoge2 = new TypeAB();     List<String[]> ab = new ArrayList<String[]>;     String[] a = {"1","2","3"};     String[] b = {"4","5","6"};     ab.add(a);     ab.add(b);     hoge1.setAb(ab);     hoge2.setAb(ab);   } } ------------------------------ 上記処理についてなのですが、 現在のままでは、最終的な[hoge][hoge1]には 変数[a][b]のメモリ上のアドレスが格納されているだけで、 hoge1.ab.get(0).a = {"4","5","6"}とした場合に、 hoge2の変数[a]の値まで変わってしまいます。 これをどうにかして最終的な、 hoge1.setAb(ab); hoge2.setAb(ab); の部分で別アドレスでコピーしたいのです。 言語:Java フレームワーク:SAStrutsです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • VC#のFtpWebRequestで多階層のディレクトリを作成すること

    VC#のFtpWebRequestで多階層のディレクトリを作成することができません。 以下のようにすることで例えばftp://hogehoge.com/hoge1/というディレクトリがあったとしてそのhoge1の中にhoge2というディレクトリを作る事は出来ます。一階層のディレクトリまでなら作れることは確認しています。 Uri u = new Uri("ftp://hogehoge.com/hoge1/hoge2/") ; System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(u); ftpReq.Credentials = new System.Net.NetworkCredential(ini[1], ini[2]); ftpReq.Method = System.Net.WebRequestMethods.Ftp.MakeDirectory; System.Net.FtpWebResponse ftpRes = (System.Net.FtpWebResponse)ftpReq.GetResponse(); ftpRes.Close(); しかし、ftp://hogehoge.com/hoge1/hoge2/hoge3/hoge4/hoge5/ ぐらいまでディレクトリを作ろうとした時、上のUriの値を ftp://hogehoge.com/hoge1/hoge2/hoge3/hoge4/hoge5/ にしてもディレクトリを作る事ができません。 ftp://hogehoge.com/hoge1/hoge2/ のように一階層なら上でも書いたとおり作成できますが ftp://hogehoge.com/hoge1/hoge2/hoge3/ と指定した場合、作成することができません。 場当たり的に上のコードを4,5回繰り返すことでhoge5までの作成は可能なことは可能でしたが、リクエストを大量に送りつけてしまい、ソースも長くなってしまうので他の方法を考えたいです。 他の方法でもかまいませんので何かいい方法はございませんでしょうか。 環境 VC# 2008 .netFramework 4.0 winXP SP3

  • インターフェースの実装で実体が存在しない場合の対処について

    現在作成している部品群のパッケージを新しいパッケージに変更しなければならない ということに取り組んでいます。従来動作していた開発システムを変更することなく、 新しく開発したシステムも動作させたいと思っています。 色々考えてみたのですが行き詰まってしまい、是非お知恵をお貸し願いたいです。 長文ですが、宜しくお願い致します。 -------------------- (1)過去のパッケージのインターフェース   package hoge.hogehoge;   public interface Hoge {     public String getHoge();   } -------------------- (2)新しいパッケージのインターフェース   package new.hoge.hogehoge;   public interface Hoge {     public String getHoge();   } -------------------- (3)(2)に対する新しいパッケージのラッパー   package new.hoge.hogehoge;   public class HogeWrapper implements hoge.hogehoge.Hoge, new.hoge.hogehoge.Hoge {     private String Hoge;     public String getHoge() {       return Hoge;     }     public void setHoge( String data ) {       Hoge = data;     }   } -------------------- 上記はシステム上、(2)と(3)を利用して以下の様な形で 利用しており、Servletのセッションオブジェクトとして保管しています。  HOGE = new HogeWrapper();  HttpSession#setAttribute( HOGE, "HOGE" ); 現在まで複数のシステムは(1)を利用していたのですが、 パッケージ名を変更しなければならない、且つ旧システムでは パッケージ名を変更する事無く利用出来る様にするということで、 (2)を新しく作成、新しいパッケージ名にして(1)と(2)を 実装する様に変更しています。 この構成にしている理由が以下の通りです。  ・今まで作成した古いパッケージを利用したシステムでも   これらの情報に置き換えてきちんと動作させたい。  ・Servletでセッションオブジェクトとして保存されており、   新しいパッケージでも古いパッケージでも同じセッション   オブジェクトを扱う必要がある。    例1)旧システム     <import文>       import hoge.hogehoge;     <利用文>       Hoge HOGE = ( Hoge ) HttpSession#getAttribute( "HOGE" );    例2)新システム     <import文>       import new.hoge.hogehoge;     <利用文>       Hoge HOGE = ( Hoge ) HttpSession#getAttribute( "HOGE" );  ・二重にラッパーを持つと、メンテが発生した際に両方を   行わなければならず、メンテ漏れを発生させたくない。  ・二重に持っても新パッケージのシステムでは旧パッケージを   利用する旨の記載を残せないのが基本のため、動作しない。 上記のままだと、一応はきちんと動作しますが、ここで問題があります。 (1)は古いパッケージということもあり、システムによって 存在したり存在しなかったりする可能性があります。 この場合(3)の実装で存在しないインターフェースを記述して いることがあるためにエラーが発生すると思います。 何か上手く回避する方法や新たな案はないでしょうか? 宜しくお願い致します。

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")