根据此How to access html controls in code behind,我应该能够添加' runat ="服务器"'我的html元素如下:
<input type="email" id="email" runat="server" />
...然后通过C#中的ID访问html元素,如下所示:
String usersEmail = email.Value;
然而,尝试这样做会导致&#34; 名称&#39;电子邮件&#39;在当前上下文中不存在&#34;
尝试从代码隐藏中访问html元素进行操作真的是一个失败的原因吗?
回答/回应史蒂夫布鲁克斯&#39;建议,这是我在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,而不是&#34; Page&#34;我有&#34;控制&#34; (它派生自UserControl);我有&#34; CodeBehind&#34;而不是&#34; CodeFile&#34;我的遗产不同。
我尝试将 AutoEventWireup 切换为false,但没有任何区别。
谢谢Thorin,
我不知道这个要求(将所有内容包含在&#34; form&#34;标签中),但即使这样做了:
<form id="formPostTravel" runat="server">
. . . (all the html elements)
</form>
......没有区别;我仍然得到,&#34;名称&#39;电子邮件&#39;在当前上下文中不存在&#34;
另一回应史蒂夫布鲁克斯&#39;建议,它们将CodeBehind更改为CodeFile并添加一个Inherits属性,该属性应与代码隐藏文件的类名相匹配。另一个建议是将ID更改为EmailAddress或其他内容,因为它可能与保留字的某种命名冲突!&#34;:
首先,我将CodeBehind更改为CodeFile
然后,我验证了Inherits属性与我的代码隐藏文件的类名匹配。那个文件是:
namespace PostTravelWizard.PostTravelWizardWebPart
{
public partial class PostTravelWizardWebPartUserControl : UserControl
...并且继承值是&#34; PostTravelWizard.PostTravelWizardWebPart.PostTravelWizardWebPartUserControl &#34;
最后,我还更改了&#39;电子邮件&#39;中的HTML元素的ID。到电子邮件地址&#39;:
<input type="email" id="emailaddress" runat="server" />
...但现在我明白了,&#34; 这个名字&#39; emailaddress&#39;在当前上下文中不存在&#34;
关于这里正在尝试的内容的一些背景。
这是&#34;电子邮件&#34;输入在* .ascx文件中定义在html块中:
<input type="email" id="emailaddress" runat="server" />
以下是我尝试从相应的* .ascx.cs文件中访问其值的方式:
namespace PostTravelWizard.PostTravelWizardWebPart
{
public partial class PostTravelWizardWebPartUserControl : UserControl
{
. . .
String usersEmail = emailaddress.Value;
但我得到了回报,&#34; 这个名字&#39; emailaddress&#39;在当前上下文中不存在&#34;
遵循Steven Brookes的建议:
您可以右键单击ascx文件并查看设计器,然后更改为查看代码。这可能会重新生成设计器文件
我能够将一些字段输入designer.cs;其他人(大多数),因为他们开始&#34;隐藏&#34;?我不知道......
答案 0 :(得分: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 %>
标记,以使用src
和tagName
属性,而不是默认的Namespace
和Assembly
属性。
此外,html控件最终包含在Web表单中的<form>
标记中,因此用户控件中不需要它。
由于该属性,可以通过放置此用户控件的表单访问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"/>
),尝试编译(你会得到错误),重新添加,尝试编译(你会得到错误)再次尝试编译(现在它应该工作)。
答案 1 :(得分:1)
您的网页是否为asp.net网页?如果是这样,请确保您的页面指令正确指向代码隐藏文件。这样的东西应该在你的页面顶部:
<%@Page Language="C#" AutoEventWireup="false" CodeFile="Default.aspx.cs" Inherits="_Default"%>
答案 2 :(得分:1)
有时,Visual Studio忘记在“.designer”文件中定义服务器端控件,而您无法从后面的代码访问它们
在这些情况下,您必须在代码中手动定义这些元素。
请注意,您必须使用EXACT类型和元素名称定义这些变量,并将其视为“受保护”的成员