为什么用' runat =" server"'来装饰HTML元素?不能从代码隐藏中访问它们?

时间:2015-10-22 20:47:29

标签: c# sharepoint-2010 code-behind runatserver htmlelements

根据此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,但没有任何区别。

更新2

谢谢Thorin,

我不知道这个要求(将所有内容包含在&#34; form&#34;标签中),但即使这样做了:

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

......没有区别;我仍然得到,&#34;名称&#39;电子邮件&#39;在当前上下文中不存在&#34;

更新3

另一回应史蒂夫布鲁克斯&#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;

更新4

关于这里正在尝试的内容的一些背景。

这是&#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;

更新5

遵循Steven Brookes的建议:

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

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

3 个答案:

答案 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 %>标记,以使用srctagName属性,而不是默认的NamespaceAssembly属性。

此外,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类型和元素名称定义这些变量,并将其视为“受保护”的成员