- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
更新: 我一直在试验我的控件,我想我已经接近了。请继续阅读以获取最新信息。
我有 2 个 ASP.NET 2.0 用户控件,其中一个位于另一个的内部。在内部控件中,我有一个 HtmlAnchor
标记控件,我试图从外部控件为其设置 URL。当我尝试从呈现页面的标记设置 HRef
属性时,HtmlAnchor
控件为 null
并引发异常。
URL set
属性在内部或外部控件的 OnInit 事件之前以及主页的“OnPreInit
”之前被调用' 事件。我假设这是因为我在页面上的父控件标记中设置子控件的 URL 我正在呈现控件,这意味着值设置在 OnInit()
之前.这是我正在使用的代码的(精简)版本:
[ParseChildren(true)]// <- Setting this to false makes the
// page render without an exception
// but ignores anything in the markup.
[PersistChildren(false)]
public partial class OuterControl : System.Web.UI.UserControl
{
// The private '_Inner' control is declared
// in the .ascx markup of the control
[PersistenceMode(PersistenceMode.InnerProperty)]
public InnerControl Inner
{
get{ return _Inner; }
set{ _Inner = value; }
}
}
public partial class InnerControl : System.Web.UI.UserControl
{
// The private 'linkHref' control is declared
// in the .ascx markup of the control
public string Url
{
get { return linkHref.HRef; }
set { linkHref.HRef = value; }
}
}
在我的 Default.aspx 页面上使用 OuterControl 是这样的:
<uc1:OuterControl ID="OuterCtrl1" runat="server">
<Inner Url="#" />
</uc1:OuterControl>
在上面的标记示例中,如果我尝试呈现此页面,则会抛出异常,因为 linkHref
控件为空。使用我的调试器,我可以看到 InnerControl 中的每个控件都是空的,但是当访问 Url
属性时,InnerControl 和 OuterControl 的 OnInit()
事件都没有被触发.
更新
我认为添加属性“ParseChildren
”和“PersistChildren
”会有所帮助。我以前在服务器控件中使用过它们,但从未在用户控件中使用过它们,尽管效果似乎相似。我认为我没有正确解释这两个属性的文档,但它可以阻止抛出异常。但是,页面标记将被忽略。
有没有人知道有什么方法可以让这个工作。我不明白为什么这些控件会在 OnInit()
之前设置值。当我尝试使用 ASPX 标记设置它们的值时,InnerControl
的构造函数被调用了两次。一次是根据标记设置值(我假设),然后再次在 OnInit()
上设置值(我猜这就是标记值被忽略的原因)。
这种努力是无望的还是我只是从错误的角度接近它?
最佳答案
问候丹,
我之前遇到过类似的嵌套控件困惑问题,所以我发现自己很想帮忙,我也把它标记为最喜欢的,因为我喜欢它。
我将问题重现如下:-
创建了一个名为 Inner 的用户控件:
内部.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Inner.ascx.cs" Inherits="Inner" %>
<a runat="server" id="linkHref">I'm inner</a>
内部.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Inner : System.Web.UI.UserControl
{
public string Url
{
get
{
return this.linkHref.HRef;
}
set
{
this.linkHref.HRef = value;
}
}
}
创建了一个名为 Outer 的用户控件:
外层.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Outer.ascx.cs" Inherits="Outer" %>
<%@ Register src="Inner.ascx" tagname="Inner" tagprefix="uc1" %>
<uc1:Inner ID="_Inner" runat="server" />
外层.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Outer : System.Web.UI.UserControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public Inner Inner
{
get
{
return this._Inner;
}
}
}
然后创建了一个名为 Default 的页面:
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register src="Outer.ascx" tagname="Outer" tagprefix="uc1" %>
<%@ Reference Control="~/Inner.ascx" %>
<!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 runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:Outer ID="Outer1" runat="server">
<Inner Url="http://google.com" />
</uc1:Outer>
</div>
</form>
</body>
</html>
有了所有这些,页面“默认”运行良好。
我在你的代码中发现奇怪的是这一行:
public InnerControl Inner
{
//...
set{ _Inner = value; }
}
为内部控件创建一个 setter 有什么意义?我无法理解。内部控件实例应该是从外部控件中的标记创建的,并且正是这个创建的实例应该操作其 html anchor 。如果我将这些行添加到 Outer.ascx.cs 中的 Inner 属性
set
{
this._Inner = (ASP.inner_ascx)value;
}
我将得到与原始情况相同的空引用异常。我认为 setter 指示 ASP.Net 页面生成器创建另一个内部控件实例并使用 Inner 属性设置它。我不确定,但如果您有时间,您可以通过检查页面构建器生成的 cs 文件来确切了解这是如何发生的,它们驻留在临时 ASP.Net 文件中。
关于c# - 为什么我的自定义用户控件的子控件没有被初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429202/
我想实现自定义搜索,但遇到了一个麻烦。我需要将 UIButton、SearchBar 组合在一个控件中,以便我可以通过指针引用它。然后我将向该组合控件动态添加更多 UIbutton。最重要的是,我想将
它没有在我的方法中执行 if block 中的语句 母版页:- 页面加载事件:- Control c = new Control(); DoSomething(c); 我的方法:- protecte
ComboBox 控件有一个 setConverter 方法,请参阅 JavaFX ComboBox - Display text but return ID on selection举个例子。我正在
我没有找到任何包含用于标记化(标记)文本输入的控件的 wpf 库。也许我找不到库,因为我错误地调用了这个组件。怎么叫或者哪里有这样的库? 最佳答案 DevExpress WPF 库包含多个数据编辑控件
是否有 Silverlight 控件允许您输入文本并将其突出显示为代码? 例如: foreach (client in Clients){ client.Save();} would become
我有以下用户控件 a) Panel.ZIndex="99999999" 是否是将此控件设置为该控件中 TopMost 的正
是否可以在 Windows 窗体中使用 C# 在窗体加载时隐藏所有特定控件,例如标签或按钮,然后选择显示我不想显示的那些? 我有一个包含很多按钮和标签的程序,但我只想在加载时显示一两个,我觉得对每个标
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Duplicating components at Run-Time 我有一个TMyControl ( Contro
我正在尝试在 Delphi 中编写一个 dll 库,其中包含一个创建 TFrame 后代实例并返回它的函数。但是当我在应用程序中导入这个函数时,每次调用它时,我都会得到一个异常,例如“'xxx'控件没
是否有 Win32 API 调用来确定哪些窗口和/或控件在特定坐标和/或鼠标下可见? 最佳答案 您可以使用GetWindowFromPoint 。它将返回窗口句柄,以便您可以使用 GetClassNa
我需要在编辑控件中输入以下公式: 公式是在 MS Word 中制作的。尝试将其复制/粘贴到编辑控件(单行或多行)后,我得到 M 0.33 Q10T9.1-9.7。 当我输入这个时,我正在研究 Rich
我只是想成功地将它添加到我的窗口中,但这却出奇地困难。 我已经尝试过 #include "windef.h" #include "winbase.h" #include "initguid.h" #i
我希望能够使用 google maps api v3 拥有自己的“街景”按钮。单击按钮时,我希望它根据我的标记经纬度加载街景。然后我希望按钮更改为“返回 map ”,然后再次加载默认 map View
我目前正在用 PHP 开发(另一个)开源 CMS,我想使用 javascript 控件,尤其是管理面板。问题是,是否有任何具有 PHP 接口(interface)的开源、可自由分发的控件(用于创建 j
我为其编写软件的产品之一是会计类应用程序。它用 C++ 编写,使用 C++ Builder 和 VCL 控件,连接到运行在 Linux 上的 PostgreSQL 数据库。 PostgreSQL 数据
我使用 Key Listener 来读取用户的输入,但我遇到了问题。首先,我读到 JTextField“请输入您的姓名”。如果用户输入一个名字,例如 John,它将更改为 John。但是,如果用户输入
我正在尝试对齐数据表列中的复选框(h=center,v=middle) ... 但复选框仍然显示在错误的位置(见附图)
我有一个包含统计信息的 JSON 数据树: { prefix: "a", count: 20, children: [ { prefix: "a:b", c
我在 Photoshop 中设计了一个模型,我打算将它应用到我的产品目录的 ListView 控件中,但它似乎没有正确显示(未对齐?),我希望这里的人可以像我一样指出我的错误试图弄清楚无济于事。 预期
您是使用 ASP.NET 控件还是仅使用带有 CSS 的 HTML? 我在 TextBox 和 DropDownList 的宽度方面遇到了一些问题。在不同的浏览器中,宽度会有所不同,控件的大小也不会相
我是一名优秀的程序员,十分优秀!