2009-07-28 5 views
1

私はasp.netを自習しており、より良いコンセプトを理解するのに役立つ小さなプロジェクトを試していました。どのように動的に追加されたhtmlタグにアクセスできますか?

私は、htmlとasp.net(c#)を使用して簡単なeラーニングWebサイトを作成しています。そのページの1つに複数の選択肢アンケートがあります。 ランダム質問を選択してアンケートを作成します。 divタグのinnerhtmlに挿入する前に、正しくフォーマットされた質問(ラベル内の質問とラジオボタンとしての回答)を含むhtmlコードを保持する文字列を作成します。 上記はすべてpageload()で行われました。 問題は、答えのシート(私はすでに正しい答えを配列に格納しています)をチェックする必要がありますが、HTMLコードがページの読み込み後に追加されるため、コードの後ろにタグまたはIDが表示されます。

質問: 私はrequest.form ["Q#"]を使用してhtmlタグにアクセスできますか? することができますいくつか私に教えてください..それはできますか?

など、同じタスクを実行する他の方法がありますか? (plzの下の注記を参照してください)

注: 私はhtmlでアンケート構造を作成してから、質問/回答をラベルに追加できます。

またはrunatサーバーのプロパティで隠しフィールドを作成し、その中に回答を保存して、サーバ側のコードで回答シートをチェックしてください。

答えて

2

質問:私はrequest.form ["Q#"]を使用してhtmlタグにアクセスできますか? some1私に説明してくださいできます..それはできますか?

これはあなたが書いたものです。 Request.Formは、ページ上のフォームフィールドごとに1つのレコードを持つ連想配列です。配列は、入力フィールドのname属性によってキーインされます。サーバー側のコントロールの場合、これは通常、コントロールのClientIdにデフォルト設定されています...しかし、あなた自身でHTMLを生成している場合、何かが行きます。

if(Request.Form["Q0"] == answers[0]) { 
    //Answer is correct 
} 

しかし、物事の音から、あなたが後にしていることを達成するためのより良い方法があります。

リピータコントロールを使用して、そのデータソースを質問に関する情報を含む配列に設定することもできます。あなたはこのような何かを行うことができます。

foreach(item as RepeaterItem in repeater) { 
    if(item.FindControl("radioButtonListId").SelectedValue == answer) { 
     //Answer correct 
    } 
} 

編集を:

ここRequest.Formコレクションが移入された方法の簡単な説明です。

ページの一般的な要求は、次のようになります。
クライアントは、ページへのリクエストをサーバーに送信します。
サーバーは、Asp.Netページのライフサイクル(init、load、control events、render)を実行します。
サーバーは、Asp.Netによって生成されたHTMLを取得し、それをクライアントに送信します。

クライアントは、より多くの情報をサーバーに送り返したい場合、Asp.Netによって生成された特別なフォームを送信することで、サーバーに情報を送り返します。これにより、各入力コントロールの値がAspに送信された要求に添付されます。Net:

クライアントは、サーバーに(フォーム値を添付して)POST要求を送信します。
サーバーは、Asp.Netページのライフサイクル(init、load、control events、render)を実行します。
サーバーは、Asp.Netによって生成されたHTMLを取得し、それをクライアントに送信します。

ご覧のとおり、Request.Formに値が設定されている場合は、PageInitが始まる前に設定されています(PageLoadがずっと少なくなっています)。

+0

私がのRequest.Formに渡されたキーが入力コントロールに与えられた「名前」ではなく、クライアントIDと同じでなければならないことだと思います。たとえば、次のようにチェックされているとします。* * Then Request.Form ["Test"] "Test 1 " – Greg

+0

Aaron:Question.Form [" Q1 "]を使用すると、Q1が質問#1のradiobuttonsgroupの名前になり、選択したラジオボタンの値が返されますか?また要求しないだろう。form ["Q1"]、ページが読み込まれる前にhtmlタグのIDと照合しますか? pageloadにhtmlタグをロードしています。 –

+0

@Madi D.最初のページを読み込んでいる間、フォームコレクションは空になります(ユーザーが入力を指定していないため)。ページがポストバックすると、フォームコレクションには、ユーザーがページ上の入力コントロールに入力したすべてのものが含まれます。 – AaronSieb

1

質問の文字列はHTML形式になっているので、ラベルではなくリテラルコントロールを試してください。ラベルはあなたのhtmlフォーマットを "エスケープ"しようとし、あなたのhtml文字列をスパンタグで囲みます。 divではなく、htmlパネルを使ってみてください。それは同じhtmlをレンダリングし、リテラルとラジオボタンを事実の後に挿入しやすくします。

+0

あなたの助言のためのJoel、thx。それを考慮に入れておくだろうが、私の主な問題は、ユーザが提出をクリックしたときに選択された回答にアクセスすることである。 –

0

申し訳ありませんが、何をしていますか?あなたは、サーバー側でHTMLコードを構築して、それをdivやラベルなどに追加していますか?私はこれが正しいアプローチではないと思う。

まず、適切なモデルを作成します。

  • QuestionAnswerItemは質問(テキストなど)、いくつかの選択肢(たとえば文字列のリストとして)と正しい答えを含むクラスです。 QuestionAnswerItemのリストを保持する
  • アンケートクラスは、あなたが、その後リピータ(または他のデータバインドコントロール)を使用して、CheckBoxListRadioButtonListのようにリストコントロールを使用する必要があります

オブジェクト。リピータコントロールのMSDNドキュメントをチェックしてください。DataSourceプロパティとDataBind()メソッドです。私はそれがあなたを助けると確信しています。

リピーター項目を繰り返し、FindControl(...)メソッドを使用してRadioButtonListまたはCheckBoxListのコントロールを見つけることで、選択した回答にアクセスすることができます。コントロール参照を取得したら、それを反復して"Selected"プロパティをチェックすることができます。

この方法を使用すると、Request.Form[...]を取り除くことができます。私は今までそれを使用する必要はほとんどありませんでした。

0

ASP.NETには、従来のHTMLコントロールを置き換える「Webサーバーコントロール」があります。

たとえば、< HTMLのinput type = "radio" />はサーバーコントロールとして< asp:RadioButton runat = "server" />になります。 RadioButtonListなどの従来のHTMLコントロールに1対1の方法でマップされないWebサーバーコントロールもあります。

これにより、コードの背後にあるフォームデータに簡単にアクセスできます。

http://support.microsoft.com/kb/306459

+0

@Greg:私はすべてのコントロールについて知っています。私はアンケートの最初のテンプレートを作成するためにそれらを使用しました。それは簡単で簡単でした。問題は、スマートになるようにして、さらに複雑にしたときでした。 と私はページロード時にタグを追加できません。ページ作成時にコンパイルされることはありません。 –

関連する問題