1

私はvb.NETでレシピブックに取り組んでいますが、PHPのバックグラウンドがあります。保存する前にレシピに複数の材料を追加する機能を構築しようとしています。

PHPでは、オートコンプリート入力と追加ボタンがあります。追加ボタンを押すと、材料が材料のリストに追加され (材料 ID の隠しフィールドがある)、レシピを投稿するときに、投稿データを単純にループして、次のような ID を抽出します。

<div id="ingredient-list">
 <div>
  <input type="hidden" name="ingredient[0]" value="32" />
  <span>Potatoes</span>
 </div>
</div>
<div>
 <input type="text" onKeyUp="IngredientSearch(this)" />
 <div id="food-search-results" class="auto-complete"></div>
</div>

foreach($_POST['ingredient'] as $ingredient) {
 recipe.addIngredient($ingredient);
}

ただし、.NET でこのようなタスクを実行する方法がわかりません。現在、追加ボタンがページへのポストバックを引き起こし (これは望ましくありません)、データを asp:repeater に追加しています。誰かが私を正しい方向に向けるか、コード例を教えてください。

余談ですが、次のタスクは、ユーザーが複数の画像をアップロードできるようにすることです。これはほとんど同じように機能しますが、ファイルが既存の入力に添付されるたびに新しいファイル入力を追加します。

4

2 に答える 2

1

ポストバックを発生させようとしていない場合は、ボタンを html ボタンとして実行するか、ボタンとリピーターを更新パネルに配置することができます。これにより、部分的なポストバックが発生します。そうしないと asp:repeater を更新できないと思うので、これはおそらくより良いオプションです。

Titopo が言ったように、リストを使用して ID を保存するか、データセットを使用して ID とテキスト値の両方を Viewstate に保存することをお勧めします。

ボタンをクリックすると、次のようなことができます...

        Dim ds As DataSet
        Dim dt As DataTable
        If Not ViewState("Ingredients") Is Nothing Then
            ds = ViewState("Ingredients")
            dt = ds.Tables(0)

            Dim dr As DataRow = dt.NewRow
            dr.Item("IngredientID") = IngredientID' However you would get that.
            dr.Item("Ingredient") = txtIngredient.Text
            dt.Rows.Add(dr)
        Else
            ds = New DataSet
            dt = New DataTable
            dt.Columns.Add(New DataColumn("IngredientID"))
            dt.Columns.Add(New DataColumn("Ingredient"))

            Dim dr As DataRow = dt.NewRow
            dr.Item("IngredientID") = IngredientID' However you would get that.
            dr.Item("Ingredient") = txtIngredient.Text
            ds.Tables.Add(dt)
            ds.Tables(0).Rows.Add(dr)
        End If

        Dim dv As DataView = dt.DefaultView
        dv.Sort = "Ingrediant ASC"
        repIngrediants.DataSource = dv
        repIngrediants.DataBind()         ' -- Bind to your repeater here

        ViewState("Ingredients") = ds

これにより、各成分の ID とテキストが保存されます。これが更新パネルにある場合、スムーズに実行され、ボタン、テキスト ボックス、リピーターのあるセクションのみが読み込まれます。

于 2012-09-25T17:46:13.170 に答える
0

ウィルASP:Buttonは常にポストバックを引き起こします。ボタンを押したときに各材料を保存することをお勧めしますが、すべてを POST として送信する場合は、 を使用しViewStateて材料のリストを保存できます。

イベントPage_Loadについて:

If Not Me.IsPostBack Then
  ViewState("Ingredients") = New List(Of Integer)
End If

そしてAddButton OnClickイベントでは:

Dim list = CType(ViewState("Ingredients"), List(Of Integer)
list.add(ingredient_id)
ViewState("Ingredients") = list

この後、ステートメントを使用してFor Eachすべての成分を抽出し、文字列を形成して POST 変数として送信できます。

于 2012-09-25T10:25:19.737 に答える