当前上下文中不存在项目

时间:2014-05-25 19:32:40

标签: c# asp.net

我想知道为什么,在我的代码隐藏中,有时我必须使用特殊技巧才能在我的.aspx webform中查看元素,有时我不会。 例如:

DropDownList clrslct = (DropDownList)FindControl("ColorSelector");
clrslct.SelectedValue = Request.Cookies["BackgroundColor"].Value;

有时候我必须写这个,以便我的代码隐藏在其关联的.aspx文件中查看标签。其他时候我可以简单地在我的代码中调用标记的ID,它工作正常。有没有人知道为什么会这样?

完整代码(来自http://asp.net-tutorials.com/state/cookies/)是:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Cookies</title>
</head>
<body runat="server" id="BodyTag">
    <form id="form1" runat="server">
    <asp:DropDownList runat="server" id="ColorSelector" autopostback="true" onselectedindexchanged="ColorSelector_IndexChanged">
        <asp:ListItem value="White" selected="True">Select color...</asp:ListItem>
        <asp:ListItem value="Red">Red</asp:ListItem>
        <asp:ListItem value="Green">Green</asp:ListItem>
        <asp:ListItem value="Blue">Blue</asp:ListItem>
    </asp:DropDownList>
    </form>
</body>
</html>

代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;`enter code here`
using System.Web.UI;
using System.Web.UI.WebControls;

namespace cookiesSessionsViewStates
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Cookies["BackgroundColor"] != null)
            {
                DropDownList clrslct = (DropDownList)FindControl("ColorSelector");
                clrslct.SelectedValue = Request.Cookies["BackgroundColor"].Value;
                BodyTag.Style["background-color"] = clrslct.SelectedValue;
            }
        }

        protected void ColorSelector_IndexChanged(object sender, EventArgs e)
        {
            BodyTag.Style["background-color"] = ColorSelector.SelectedValue;
            HttpCookie cookie = new HttpCookie("BackgroundColor");
            cookie.Value = ColorSelector.SelectedValue;
            cookie.Expires = DateTime.Now.AddHours(1);
            Response.SetCookie(cookie);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您必须在网格视图行事件或重复控件项创建事件之类的内容中使用FindControl - 因为没有一个控件,所以有零个或多个控件,具有相似的名称/ id。

这些控件位于NamingContainer's,这是在模板中查找它们的基础。如果您正在创建一个Web应用程序,那么将创建一个designer.cs文件并使其可见(它也是为网站创建的,但仅在编译时创建),并且可以从您的代码隐藏类中访问其中的任何内容。 / p>

所以,简单的回答:在命名容器中,你必须使用FindControl或类似的东西才能找到它,在命名容器之外它可以直接解决。

答案 1 :(得分:0)

如果我希望代码保留在我的代码隐藏中,我现在必须坚持使用FindControl。 我最终使用了:

System.Web.UI.HtmlControls.HtmlControl bdyBodyTag = (System.Web.UI.HtmlControls.HtmlControl)FindControl("BodyTag");

感谢所有建议。