0

この質問は以前に尋ねられたと思いますが(すべての質問ではありませんか?)、解決策を見つけるために必要な言語に苦労しているので、ここにいくつかの詳細があります:

住所、都市、州などの単一の場所を更新するためのWebフォームがあります。これは、コードビハインドで参照されるさまざまなasp:TextBoxを含む静的な場所更新フォームを使用して処理されます。コントロール、例えばStreetAddressTextBox.Text。

このフォームを更新して、複数の場所で機能するようにしたいと思います。以前、PHPを使用していたとき、これは、レンダリングしているコレクションのforループでフォームコンテンツをラップし、各アイテムをID="StreetAddressTextBox_<%=locationId%>"似たようなスキーマで参照する多くのインラインコードを作成することを意味していました。

私は現在ASP.NETでこの方法を実行していますが、特にフォームコンテンツがない他のページで確立した多くのコードビハインドパラダイムをキックする必要があるため、インラインは汚い感じがしますコレクションに基づくスケーリング。私の内臓は、場所をテンプレート化し、コードビハインドですべてを実行する方法があるはずだと言っていますが、実際にこれを示す例はまだありません。

よろしくお願いします。

4

2 に答える 2

4

私があなたを正しく理解していると仮定すると、UserControlを使用する必要があるように聞こえます。

基本的に、UserControl.ascxファイルを作成します(VSはUserControl.designer.csと分離コードクラスを生成します)。次に、次のように、特別な属性を指定せずに入力フィールドをそこに配置します。

(私はWebControlsよりもHtmlControlsを好むことに注意してください。それらはよりクリーンなマークアップを提供し、物事を混乱させません。試してみることをお勧めします):

<%@ Control blargh %>
<label for="<%= Street.ClientID %>">Street address</label>
<input type="text" runat="server" id="Street" /> <br />

<label for="<%= City.ClientID %>">Town / City</label>
<input type="text" runat="server" id="City" /> <br />

<!-- etc -->

id=""入力コントロールの属性をいじっていないことに注意してください。次に、web.configに登録します。

<add tagPrefix="foo" tagName="Address" src="~/Controls/Address.ascx" />

次に、アドレスフォームが必要な各ページで(UserControlがAddressControlと呼ばれると仮定)

<%@ Page blargh %>
<p>Enter your address details below:</p>
<foo:Address runat="server" id="Address" />

次に、ページのコードビハインドでこれを行うことができます。

 public override void OnLoad(Object sender, EventArgs e) {
      if( Page.IsPostBack ) {
          Validate();
          if( Page.IsValid ) {
              // get values from a POST
              String street = this.Address.Street.Value;
              String city   = this.Address.City.Value;
              // and so on
          }
      } else {
          // set values if you're retrieving data from a DB or something
          this.Address.Street.Value = "123 Fake Street";
          this.Address.City.Value = "Frying Pan City";
      }
 }

"<%= Street.ClientID%>"-thingをどのように使用したかに注意してください。ASP.NETは、コントロールの親名に基づいて(以下同様に再帰的に)コントロール名とIDを自動的に生成します。したがって、実際のHTML入力は次のようにレンダリングされます。

<label for="Address.Street">Street address</label>
<input type="text" name="Address_Street" id="Address.Street" />

この設計と実践はWebFormsにのみ適用されることに注意してください。ASP.NETMVCはまた完全に異なります。

于 2012-09-13T23:58:42.207 に答える
0

を使用できます<asp:PlaceHolder runat="server" id="plcDynamicControls" />

コードビハインドでを作成しprivate List<WebControl> dynamicControlsます。

返品時.Init()には、要件に適したロジックlocationID、およびフィールド要件が何であれ。

locationID = 4必須のName、Address1、Address2フィールドを入力します。

Page_Init(object Sender, EventArgs e) 
{
    TextBox txt = new TextBox(){
        ID = "txtName"    
    };
    plcDynamicControls.Controls.Add(txt); //Add to Form
    dynamicControls.Add(txt); //Add to reference list, to avoid having to do .FindControl()

    TextBox add1 = new TextBox(){
        ID = "txtAddress1"    
    };
    plcDynamicControls.Controls.Add(add1); 
    dynamicControls.Add(add1); 

    TextBox add2 = new TextBox(){
        ID = "txtAddress2"    
    };
    plcDynamicControls.Controls.Add(add2);
    dynamicControls.Add(add2); 
}

そのようなコントロールをプレースホルダーに追加するための素晴らしいループを構築します。

.Click()イベントでは、送信ボタンからList<WebControl> dynamicControlsコレクションを繰り返し処理して応答を処理できます。

于 2012-09-14T04:22:46.880 に答える