0

根据这个How to access html controls in code behind,我应该能够将 'runat="server"' 添加到我的 html 元素中,如下所示:

<input type="email" id="email" runat="server" />

...然后通过 C# 中的 ID 访问 html 元素,如下所示:

String usersEmail = email.Value;

但是,尝试这样做会导致“当前上下文中不存在名称‘电子邮件’

试图从代码隐藏中访问 html 元素以进行操作真的是一个失败的原因吗?

更新

在回答/响应史蒂夫布鲁克斯的建议时,这是我在 ascx 文件顶部的内容:

<%@ Control Language="C#" AutoEventWireup="true" 
CodeBehind="PostTravelWizardWebPartUserControl.ascx.cs"
Inherits="PostTravelWizard.PostTravelWizardWebPart.PostTravelWizardWebPartUserControl" %>

...而布鲁克斯先生推荐这样的东西:

<%@Page Language="C#" AutoEventWireup="false" CodeFile="Default.aspx.cs" 
Inherits="_Default"%>

这足够接近吗?IOW,而不是“Page”,我有“Control”(它源自 UserControl);我有“CodeBehind”而不是“CodeFile”,我的继承不同。

我尝试将AutoEventWireup切换为 false,但没有任何区别。

更新 2

谢谢索林,

我不知道这个要求(将所有内容都包含在“表单”标签中),但即使这样做了:

<form id="formPostTravel" runat="server">
   . . .  (all the html elements)
</form>

...没什么区别; 我仍然得到,“名称'电子邮件'在当前上下文中不存在”

更新 3

对 Steve Brookes 建议的另一个回应是“将 CodeBehind 更改为 CodeFile 并添加一个 Inherits 属性,该属性应与您的代码隐藏文件的类名相匹配。另一个建议是将 ID 更改为 EmailAddress 或其他东西,因为它可能是某种与保留字的命名冲突!”:

首先,我将 CodeBehind 更改为 CodeFile

然后,我验证了 Inherits 属性与我的代码隐藏文件的类名匹配。该文件是:

namespace PostTravelWizard.PostTravelWizardWebPart
{
    public partial class PostTravelWizardWebPartUserControl : UserControl

...继承值是“ PostTravelWizard.PostTravelWizardWebPart.PostTravelWizardWebPartUserControl

最后,我还将 HTML 元素的 ID 从“email”更改为“emailaddress”:

<input type="email" id="emailaddress" runat="server" />

...但现在我得到了,“名称'emailaddress'在当前上下文中不存在

更新 4

有关这里正在尝试的内容的一些背景信息。

这是在 *.ascx 文件中的 html 块中定义“电子邮件”输入的位置:

<input type="email" id="emailaddress" runat="server" />

这是我尝试从相应的 *.ascx.cs 文件中访问其值的方式:

namespace PostTravelWizard.PostTravelWizardWebPart
{
    public partial class PostTravelWizardWebPartUserControl : UserControl
    {
    . . .
    String usersEmail = emailaddress.Value; 

但我得到了奖励,“当前上下文中不存在名称‘emailaddress’

更新 5

遵循 Steven Brookes 的建议:

您可以右键单击 ascx 文件并查看设计器,然后更改为查看代码。这很可能会重新生成设计器文件

我能够将一些字段放入designer.cs;其他人(大多数)因为他们开始“隐藏”?我不知道...

4

3 回答 3

1

您的页面是asp.net 页面吗?如果是这样,请确保您的页面指令正确指向您的代码隐藏文件。像这样的东西应该在你的页面顶部:

<%@Page Language="C#" AutoEventWireup="false" CodeFile="Default.aspx.cs" Inherits="_Default"%>
于 2015-10-22T20:57:14.050 回答
1

有时 Visual Studio 忘记在“.designer”文件中定义您的服务器端控件,您无法从后面的代码中访问它们

在这些情况下,您必须在代码中手动定义这些元素。

请注意,您必须使用元素的确切类型和名称以及“受保护”成员来定义这些变量

于 2015-10-22T21:04:48.347 回答
1

您可能忘记将其放入服务器端形式:

  <form id="form1" runat="server">
    <input type="email" id="email" runat="server" />
  </form>

html 元素需要在表单标签内,并且表单标签和 html 元素都需要runat="server"作为属性,然后您才能从代码隐藏中访问它们。

更新 1

我创建了一个测试 web 表单和测试用户控件,并将用户控件放在 web 表单中。这是所有代码:

TestWebForm.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestWebForm.aspx.cs" Inherits="TestWeb.TestWebForm" %>
<%@ Register TagPrefix="uc" src="~/TestWebUserControl.ascx" tagName="TestWebUserControl" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <form id="form1" runat="server">
        <uc:TestWebUserControl id="TestWebUser" runat="server" />
    </form>
</body>
</html>

TestWebForm.aspx.cs

using System;
using System.Web.UI;

namespace TestWeb
{
    public partial class TestWebForm : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var y = TestWebUser.InnerControlEmail.Value;
        }
    }
}

TestWebUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestWebUserControl.ascx.cs" Inherits="TestWeb.TestWebUserControl" %>

<input type="email" id="ControlEmail" runat="server" />

TestWebUserControl.ascx.cs

using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;

namespace TestWeb
{
    public partial class TestWebUserControl : UserControl
    {
        public HtmlInputGenericControl InnerControlEmail
        {
            get { return ControlEmail; }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            var x = ControlEmail.Value;
        }
    }
}

这对我有用。请注意,我必须更改<%@ Register %>标签以使用srcandtagName属性而不是默认的NamespaceandAssembly属性。

此外,html 控件最终被包装在<form>web 表单中的标记中,因此用户控件中不需要它。

并且由于该属性,html 控件可以通过放置此用户控件的表单进行访问。

更新 2

这是 TestWebUserControl.ascx.designer.cs 文件:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated. 
// </auto-generated>
//------------------------------------------------------------------------------

namespace TestWeb {


    public partial class TestWebUserControl {

        /// <summary>
        /// ControlEmail control.
        /// </summary>
        /// <remarks>
        /// Auto-generated field.
        /// To modify move field declaration from designer file to code-behind file.
        /// </remarks>
        protected global::System.Web.UI.HtmlControls.HtmlInputGenericControl ControlEmail;
    }
}

如果我删除protected global::System.Web.UI.HtmlControls.HtmlInputGenericControl ControlEmail;,我会得到你的确切错误。因此,您的设计器文件很可能不正常。

从您的 .ascx 文件中删除 html 控件定义 ( <html id="email"/>),尝试编译(您会收到错误),重新添加,尝试编译(您会收到错误)再次尝试编译(现在它应该可以工作了)。

于 2015-10-22T20:55:55.047 回答