【问题标题】:Creating controls with unique IDs dynamically inside an ASP.NET repeater在 ASP.NET 中继器内动态创建具有唯一 ID 的控件
【发布时间】:2013-01-29 14:44:41
【问题描述】:

我有一个文件列表(存储在数据库中),我希望用户能够在异步回调中上传这些文件。

我已经在我期望的每个文件的名称旁边显示 AJAX 控件工具包的 AsyncFileUpload 控件:

<asp:Repeater ID="SourceTables" runat="server">
    <ItemTemplate>
        <tr>
            <td>
                <%#DataBinder.Eval(Container.DataItem, "LongName")%>
            </td>
            <td>
                <ajax:AsyncFileUpload runat="server" ClientIDMode="AutoID" />
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

所有这些异步上传控件最终都会在后面的代码中调用相同的方法,这很好,但是当我来保存文件时,我需要一些方法来确定哪个控件导致回发(即几个控件中的哪个)文件刚刚上传)。但是,我一直无法在中继器内动态设置 ID(我相信这只能通过后面的代码实现)。

显然这不起作用:

<ajax:AsyncFileUpload ID=<%#DataBinder.Eval(Container.DataItem, "ShortName")%> runat="server" ClientIDMode="AutoID" />

是否有另一种方法可以在转发器(或其他方式)内动态设置每个上传控件的 ID,或者我可以采取其他方法?

【问题讨论】:

  • 那么,在代码中设置它是一个选项吗?
  • 在转发器中添加控件时,我不知道该怎么做。

标签: c# asp.net asp.net-4.0


【解决方案1】:

您可以在转发器的“ItemDatabound”事件中动态添加控件。

【讨论】:

  • 是的,这绝对是最好/最简单的方法。谢谢 Sreekanth。
【解决方案2】:

您如何处理回发事件?

如果您使用 AsyncFileUpload 控件的 UploadedComplete 事件,则通过 AsyncFileUploadEventArgs 对象获取上传的文件。

您还可以将 sender 强制转换为 AsyncFileUpload 控件,然后通过 PostedFile 属性获取文件。

 protected void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e)
 {
     string savePath = MapPath("~/Uploads/" + Path.GetFileName(e.filename));
 }

【讨论】:

  • 谢谢 - 是的,这正是我正在做的。但我不想使用相同的文件名保存(我不信任传入的文件名),所以我想确定哪个控件正在执行回发并(基于此)使用特定文件名等保存。
  • 好的 - 传递给事件处理程序的发送者对象,实际上是 AsyncFileUpload 控件。因此,您应该能够随心所欲地投射和使用它。在类似的情况下,我一直使用 guid 作为文件名保存文件,但文件扩展名与传入文件名相同。
  • 您还可以使用发送方控件的 Parent 属性遍历控件树,以获取您在数据绑定中使用的 DataItem。
  • 通过使用 Parent 属性,我已经成功地完成了我想做的事情 - 非常感谢这个想法。我不认为我做得很好——我能以这种方式获得的唯一有用的属性是 ItemIndex。鉴于此,并再次执行我的数据库查询以获取转发器绑定到的数组,我可以计算出RepeaterItem 中的内容。但是,正如您所说,有什么方法可以通过 Parent 属性访问带有绑定数据的 DataItem 吗?如果不清楚,我会更详细地重写。再次感谢托马斯。
【解决方案3】:

类似的东西

  <ajax:AsyncFileUpload runat="server" id="afuMyUpload" ClientIDMode="AutoID" OnClientUploadComplete="MyFunction" />



   foreach (Control c in SourceTables.Items)
   {
        var myUpload = c.FindControl("afuMyUpload") as AsyncFileUpload;
        //Do stuff with your control
   }

【讨论】:

  • 有什么办法可以让我将 ID 设置为创建它们的中继器的 DataItem 的属性?
  • @Chris 您是指服务器 ID 还是客户端 ID?在中继器中设置 ServerId 并没有太大的作用,因为您不能直接访问它们。你仍然需要像上面那样浏览它们。
【解决方案4】:

您不能绑定控件的ID 属性。您需要在后面的代码中创建控件并将其添加到转发器。

例子:

protected void GridDataBind(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow) {
        IEnumerable list = PremiumUnitFees.PremiumAmenities.ObtainFeesForProject(IntranetUser.Current.ProjectId);
        foreach (PremiumUnitFees.PremiumAmenities feature in list) {
            e.Row.Cells(3).Controls.Add(new CheckBox {
                ID = feature.Id.ToString(),
                Text = feature.NickName,
                Checked = PremiumUnitFees.PremiumUnitView.IsUnitPremium(feature.Id, Convert.ToInt64(DataBinder.Eval(e.Row.DataItem, "Id")))
            });
        }
    }
}

【讨论】:

  • 抱歉这个愚蠢的问题,但是如何在代码后面创建控件并将其添加到转发器?我找不到任何例子。
  • @Chris 我会更新我的答案。由于我在火车上通过电话接听您,所以这是非常基本的,抱歉。
猜你喜欢
  • 2011-03-25
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多