【问题标题】:Repeating inputs vb.net重复输入 vb.net
【发布时间】:2012-09-25 10:02:55
【问题描述】:

我正在编写 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。谁能指出我正确的方向或代码示例。

顺便说一句,我的下一个任务是允许用户上传多张图片。其功能大致相同,但在将文件附加到现有输入时添加新的文件输入。

【问题讨论】:

    标签: javascript .net vb.net


    【解决方案1】:

    如果您不想引起回发,您可以将按钮作为 html 按钮,或者您可以将按钮和转发器放在更新面板中。这将导致部分回发。这可能是更好的选择,因为我认为您无法更新 asp:repeater。

    正如 Titopo 所说,我建议使用列表来存储 ID,或者您可以使用数据集在 Viewstate 中存储 ID 和文本值。

    点击你的按钮,你可以做这样的事情......

            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 和文本。如果你在更新面板中有这个,它会顺利执行,并且只加载带有按钮、文本框和中继器的部分。

    【讨论】:

    • UpdatePanel 看起来很有趣,但它仍然不是我想要的。当然,这可以在没有任何类型的回发的情况下完成。应该可以使用 JavaScript 动态更改 html 服务器端,并且仍然可以成功处理服务器端。
    【解决方案2】:

    ASP:Button 总是会导致回发。我建议您在按下按钮时存储每种成分,但是,如果您想将所有成分作为 POST 发送,您可以使用ViewState 存储成分列表。

    关于Page_Load 事件:

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

    AddButtonOnClick事件中:

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

    之后,您可以使用For Each 语句提取所有成分,形成字符串并将其作为 POST 变量发送。

    【讨论】:

    • 也许我急忙说ASP:Button 总是会导致回帖。看来您可以使用参数OnClientClick 来避免这种行为(例如:OnclientClick="return false;")。
    • 我知道 asp:Button 会导致回发。我正在尝试编译成分列表,而无需在每次添加成分时都进行回发。我想建立一个成分列表,然后通过一次回传将它们全部提交。
    • 使用ViewState这将是一个回发,但您可以随时保存成分列表。您也可以使用OnClientClick 属性调用存储列表的脚本,但我认为这不是更好的选择。
    • 我已经在做类似的事情,但我不明白为什么在完整提交表单之前需要任何形式的回发以保存详细信息。 Html 应该是可修改的客户端,然后应该在所有修改完成后在服务器端进行处理。
    • 正如您在 cmets 中看到的,可以避免回发行为。但如果你这样做,我认为你在大多数情况下失去了 ASP.NET 的优势。如果您的问题只是刷新效果,您可以随时使用PanelUpdate
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多