【问题标题】:How to get the value of an html textbox placed in a repeater, through ASP.NET code-behind?如何通过 ASP.NET 代码隐藏获取放置在转发器中的 html 文本框的值?
【发布时间】:2011-11-03 23:05:53
【问题描述】:

我有一个转发器,它在 ItemTemplate 中包含一个文本框 (html)。

我无法创建 asp 文本框,因为需要通过 jQuery 访问相关文本框以供用户操作文本框。

用户完成后,在相应的中继器行中按下一个 asp 按钮,我想通过后面的代码 (c#) 获取用户在文本框中输入的值。

谁能告诉我这是否可能?如果可以,能否推荐一些代码?

否则,有任何非 AJAX 替代方案吗?

【问题讨论】:

  • 在这里很难说出你想要什么。您是否打算将 TextBox 的值提交到某处的 AJAX 函数或您的中继器所在的页面?
  • @jwiscarson 把它想象成一个表单——用户在 html 文本框中输入数据,当按下按钮时,这些数据必须放入数据库中。不深究,html文本框必须强行使用,不能有AJAX。因此,我后面的 C# 代码必须获取用户在文本框中输入的数据。

标签: c# javascript jquery asp.net html


【解决方案1】:

在 jQuery 中引用 asp.net 组件没有问题。有几点需要了解:

  1. 该项目将具有一个包含您最初授予控件的 ID 值的 ID。使用当前的编码方案(我无法想象 Microsoft 会发生重大变化),<asp:TextBox ID="txtBox" runat="server" /> 在 HTML 中变为 <input id="...._txtBox" name="...$txtBox" />。像 $(input[id$=txtBox]) 这样的 jQuery 选择器会找到它。
  2. 因为 asp 控件最终会解析为旧的 HTML 表单元素,所以您将它们完全视为您直接创建的 HTML 元素。在这种情况下,您可以使用禁用的伪类启用/禁用它。
  3. 通过查看为我的网页生成的源代码并了解发生了什么,我从中学到了很多。我喜欢 FireFox 的 Web 开发者工具栏及其查看生成的源代码命令。

【讨论】:

  • 我已经尝试过了,但我究竟如何获得文本?我无法访问“文本”属性,因为它是一个 html 元素。
  • 我的错。由于您在中继器中,因此您将拥有多个控件,每个控件一个。我从来没有这样做过,但你可能有身份问题。但是,您可以使用 jQuery 访问服务器控件,它们与其他所有控件一样具有 ID。使用一个选择器来捕获你想要的控件,它会工作得很好。
  • 不幸的是,我需要反之亦然。我需要通过 C# 访问一个 html 控件
  • 我的意思是你可以使用一个asp控件并且仍然使用jQuery。你说“我不能创建一个 asp 文本框,因为有问题的文本框需要通过 jQuery 访问”这是不正确的。
  • 啊,我明白你的意思了——很抱歉,误解了你。不幸的是,我开始使用 asp 控件,但由于中继器的性质遇到了问题,不得不切换到 html 控件才能工作。
【解决方案2】:

应该这样做。如果您想要/需要任何进一步的解释,请告诉我。

把它放在你的 aspx 页面中:

<form id="form1" runat="server">
<div>
<asp:Repeater ID="rptHtmlTag" runat="server">
        <ItemTemplate>
            <input id="htmlTextBox" runat="server" />
        </ItemTemplate>
</asp:Repeater>
</div>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" />
</form>

把它放在你的代码隐藏中:

protected override void OnInit(EventArgs e)
{
    this.rptHtmlTag.ItemDataBound += new RepeaterItemEventHandler(rptHtmlTag_ItemDataBound);
    this.btnSubmit.Click += new EventHandler(btnSubmit_Click);
    base.OnInit(e);
}

void btnSubmit_Click(object sender, EventArgs e)
{
    foreach (RepeaterItem item in this.rptHtmlTag.Items)
    {
        HtmlInputText htmlTextBox = (HtmlInputText)item.FindControl("htmlTextBox");
        string THIS_IS_YOUR_VALUE = htmlTextBox.Value;
    }
}

void rptHtmlTag_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        HtmlInputText htmlTextBox = (HtmlInputText )e.Item.FindControl("htmlTextBox");
        htmlTextBox.Value = String.Concat("Some Value - Index", e.Item.ItemIndex);
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        List<int> repeaterPopulator = new List<int> { 1, 2, 3 };
        this.rptHtmlTag.DataSource = repeaterPopulator;
        this.rptHtmlTag.DataBind();
    }
}

【讨论】:

  • 感谢您的意见!它看起来正是我想要的。我将尝试采用'drdwilcox's建议的方法。否则,我会试试这个。
  • 我同意@drdwilcox。这是一个更好的解决方案 :) 顺便说一句,如果您使用的是 .net 4,您可以覆盖繁琐的 .net id 并将 id 设置为您想要的任何内容。 Here's a link if it interests you
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多