【问题标题】:Getting form field names on Submit when form is user control当表单是用户控件时,在提交时获取表单字段名称
【发布时间】:2011-11-28 18:50:52
【问题描述】:

我正在慢慢地、一点一点地学习我正在使用 ASP.NET 做什么

我已经开始创建新的 Web 应用程序,但我经常遇到 ASP.NET 重命名元素 ID 或在表单字段的情况下重命名它们的名称的问题。

我有一个基本上是销售系统的表格。它本质上由两个用户控件组成,一个是客户详细信息(姓名、地址等)的表单,第二个是客户购买的表单,它由在列出项目时创建的 Javascript 动态创建的数字行组成客户正在购买。

这两个部分都是用户控件,因为它们将用于需要调用/重新输入此数据的系统的其他区域。

加载用户控件时,包含客户名称的字段重命名为"m$mainContent$customerForm$name" 我知道这是从哪里来的,“m”是我的母版页的 ID,“mainContent”是主要内容占位符和"customerForm" 是用户控件的名称。

事实上,就我而言,这在所有形式上始终保持不变,因此相对容易克服......但是......假设它不是

我可以看到有一些方法可以用 Javascript 处理这个问题,但是表单不需要 AJAX 提交,普通的 Post 就可以了,所以当我打开接收页面时,我想调用 @ 987654322@把客户的名字存入数据库,当然我真的需要Request.Form("m$mainContent$customerForm$name")%

我如何从发布表单中动态提取这些前缀,以确保如果我重命名任何内容或在不同的场景中使用它,问题不会破坏它?

我使用的是 .NET 2.0,所以不能使用静态客户端。

【问题讨论】:

  • 您是否有特定的原因要使用 Request.Form 来读取值而不是更标准的语法?
  • 请提供一些示例代码。如何在 ASPX 页面中声明用户控件?你包括 runat="server" 吗?
  • 是的,正在声明用户控件。 Request.Form 有什么问题?
  • 当控件在客户端上呈现时,ASP.NET 会更改控件的名称,以免出现命名冲突,正如您所遇到的那样。例如,如果页面上的两个用户控件都有一个名为 txtCustomerName 的文本框。 Request.Form("txtCustomerName") 会参考哪一个?通过使用控件 ID 将控件引用为对象,ASP.NET 处理了如何撤消它在 HTML 中呈现控件时所做的名称修改,因此您不必这样做。此外,将控件作为对象引用可以访问控件的属性和方法。
  • 好的,你说的原理我明白了,但是不知道怎么付诸实践。也许我对这一切都错了?基本上,我有一个包含表单的页面。该表单实际上由两部分组成,一部分是“客户”,另一部分是“项目列表”。 “Customer”和“ItemList”都是由<controls:itemList ID='itemList1' runat='server' />等渲染到浏览器中的用户控件。表单开始标记是<form id="newSale" method="post" action="saveSale.aspx">,显然这个表单标记包含两个用户控件。

标签: asp.net vb.net forms


【解决方案1】:

这确实很旧,但让我们看看它是否对你有用。

获取this 示例我设法从给定字段名称中获取值,不带前缀。

我确信这不是最好的解决方案,但它对我很有用。假设您要恢复名为“hfIdAviso”的字段的值,该字段在 POST 中以“ctl00$body$hfIdAviso”的形式出现:

var value = Request.Form.Cast<string>()
                    .Where(key => key.EndsWith("hfIdAviso"))
                    .ToDictionary(key => key, key => Request.Form[key])
                    .Values.FirstOrDefault();

这将返回该字段的值。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果您在 ASPX 页面中的用户控件声明中包含 runat="server",则只需使用控件的 ID 值即可访问此控件。

    例如 在 ASPX 中:

    <uc:MyUserControl ID="mycontrol1" runat="server" />
    

    在后面的代码中(使用 C# 语法):

    object foobar = mycontrol1.SelectedValue;
    

    【讨论】:

    【解决方案3】:

    假设您在用户控件中有一个表单,其中有一个 ID="txtfname" 的 TextBox 字段。您已经在 page1 中注册了您的用户控件,并且您希望将表单数据发布到 page2:

    在 page1 你有用户控制:

    &lt;My:WebUserControl1 ID="myuc" runat="server" /&gt;

    在page2 codebehind中,你可以通过这种方式获取用户控制表单字段(txtfname)的值:

    string firstName = Request.Form["myuc$txtfname"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      相关资源
      最近更新 更多