问题标签 [naming-containers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
data-binding - ASP.NET GridView 的自定义命名容器?
我正在寻找有关如何为 GridView 中的项目实现自定义命名容器的信息。我的问题是,我有一个 GridView,一周中的每一天都有一个单元格,每个单元格都将包含相同或相似的控件。对于相同的控件,最好将它们命名为相同的名称,例如“lblPersonName”。
但是,如果这样做,则不能使用 FindControl(),因为它会抱怨行内有具有重复 ID 的控件。问题的根源在于 GridView 中控件的命名容器不是表格的单元格(DataControlFieldCell 或其他),而是 GridViewRow。
我不知道是否有办法做到这一点,但最好能够换出默认命名容器,以便单元格成为命名容器,然后我可以拥有相同的控件名称。
诚然,为此的 ASPX 开始变得有点大 - 我开始希望我已经在 ASP.NET MVC 中启动了这个项目......
无论如何,就如何使用这样的控件实现 GridView 而言,我对其他选择持开放态度。在这一点上,使用普通的旧表并动态添加控件可能会更干净......
为澄清起见: - 每列都使用 ItemTemplate 定义,并且控件位于 ItemTemplate 中。- 现在让它工作的唯一方法是拥有“lblPersonNameOne”、“lblPersonNameTwo”等。
c# - 命名容器未在扩展器中“设置”
我想我可能知道原因,但不知道如何在没有大量代码重写的情况下解决它(我更愿意避免)。
我有
和
现在这是奇怪的部分。_CalendarExtender 在查找 _EditControl 的 ID 作为 TargetID 时会出错。这听起来像是一个命名容器的问题,所以我看了又看,找不到任何东西。然后我用调试器查看。_EditControl 和 _ImageButton 都将其命名容器设置this
为预期,但 _CalendarExtender 将其命名容器设置为null
.
我很想尝试自己解决这个问题,_CalendarExtender.NamingContainer=this;
但这是一个只读属性。
我能弄清楚这可能发生的唯一原因是因为_CalendarExtender 继承自ExtenderControl->Control。Panel 继承自 WebControl->Control 的位置。
有谁知道我可能遗漏的东西或解决此问题的方法或其他东西?
c# - 解决视图状态/命名空间冲突
我有一个列表框控件。当用户单击它时,它会告诉自定义控件使用某个 ID 来使用。
自定义控件每次都(动态地)绘制相同的内容,只是根据此 ID 加载不同的内容(它从数据库加载到类似控件的动态表单中)。
好的,现在我遇到了视图状态溢出的问题。当您单击列表框以加载 ID #1 时,一切看起来都很好。然后,单击 ID #2,在自定义控件中创建的所有文本框控件都具有与 ID #1 相同的内容。因此,当列表框索引更改时,我需要清除视图状态,但我无法让它工作。
所有控件也是在 Page_Load 中创建的。
我在 Page_Load 尝试了 ViewState.Clear() ,但没有做任何事情。
我有从 INamingInterface 派生的自定义控件,但我猜 ID 仍然与视图状态匹配。
我尝试将自定义控件 ID 更改为唯一的(例如“CONROL_”+id.ToString()) 我还尝试对包含自定义控件的面板执行相同的操作。
我似乎无法摆脱这种视图状态!
编辑好的,这里是演示问题的代码
标记:
如果您运行此代码,您会注意到,如果您更改文本框中的内容,然后更改下拉列表,那么您之前输入的内容将保留在那里,而不是被覆盖。
我的基本目标是获得它,以便当您更改为 ID #2 时,无论如何它都会将“ID #2”放在文本框中(最好不完全禁用视图状态)
asp.net - ASP.NET 数据源控件“没有命名容器”异常
我的代码中出现了这个异常,想知道是否有人可以帮助我。
我有一个绑定到 ObjectDataSource 的转发器控件,并且转发器的 itemtemplate 包含一个用户控件 (ASCX)。该用户控件又包含几个其他控件,主要是与 ObjectDataSource 关联的 GridView。
初次使用此设置中的控件时,一切正常 - 数据显示正常。但是,当我更改过滤器选项(中继器外部的下拉菜单),然后重新绑定中继器时,我得到了异常:
ObjectDataSource 控件“expDataSource”没有命名容器。确保在调用 DataBind 之前将控件添加到页面。”在 System.Web.UI.WebControls.DataBoundControlHelper.FindControl(Control control, String controlID) ... ... 在 System.Web.UI.WebControls.ObjectDataSource。 LoadCompleteEventHandler(对象发送者,EventArgs e)
我不确定问题出在哪里——我在几个地方读到将数据源移到 ASCX 控件之外可能会有所帮助——这无济于事。objectdatasource 似乎结构正确,正如我所说,它是第一次(仅)工作。
我在堆栈跟踪中注意到当 ASP.NET 在 LoadComplete() 发生后调用 FindControl() 时发生的异常。如果我单步执行我的代码,看起来好像我的所有代码都在这发生之前完成了执行,所以它都是“系统”代码。
为什么 ASP.NET 无法在 LoadComplete Handler 中找到此数据源控件?
谢谢!
其他注意事项:
每隔一段时间就会出现此错误。因此,第一次正确加载数据时,第二次刷新失败并出现此错误。再次单击“加载”,它可以工作(第三次)。
在它失败的时候,看起来“Page_Load”在 ASCX 控件中被调用了两次。所以模式是:
- 工作模式:
- 父页面上的 Page_Load
- ASCX 上的 Page_Load
数据加载正常
- 失败模式:
- 父页面上的 Page_Load
- ASCX 上的 Page_Load
- ASCX 上的 Page_Load
- 例外
这一切都发生在对“Repeater.DataBind()”的调用中,但它的行为会有所不同,具体取决于它是否已经被绑定(显然)。
更多注意事项:
真正奇怪的行为。我从 ObjectDataSource 的底部删除了 SelectParameters 列表,突然之间,页面不会因为没有 NamingContainer 而拒绝 ObjectDataSource。当然,如果没有这些参数,数据绑定实际上将无法工作……我可以将它们添加到代码中,但为什么会重要呢?
jsf - jsf如何创建命名容器
我的 JSF 应用程序中存在重复 ID 的问题。我在这篇文章中读到,可能的解决方案之一是使用命名容器。你能给我一些例子如何使用命名容器来避免重复的 ids 问题吗?我使用 Facelets。
jsf-2 - JSTL、复合、NamingContainer 和 prependId
我已经编写了一个复合组件,并且想使用保留的 EL#{component.clientId}
来进行 JQuery 绑定。为了在页面的另一个地方(组件之外)使用这个检索到的 clientId,我使用 JSTL 将它存储在视图范围变量中。奇怪的是,JSTL 似乎阻止了将其 id 附加到其子项(NamingContainer
行为)前面的自然复合组件行为。我知道 JSTL 有点棘手,ui:repeat
因为生命周期的事情会干扰其他组件(例如),但在这里我不理解这种行为。
一些具体的代码比这个长篇演讲更好:
加上注释的行,#{component.clientId}
给出类似j_idt261:mySoLovedDataTable
.
注释掉该行后,它只给出mySoLovedDataTable
.
ajax - 带有 prependId="false" 的 UIForm 中断
我有一个关于事实背后的想法的问题,它只UIForm
得到了属性prependId
。为什么接口中没有指定属性NamingContainer
?您现在可能会说这是因为向后兼容性,但我更愿意打破兼容性并让实现该接口的用户也实现 prependId 事物的方法。
从我的角度来看,关于组件中 prependId 的主要问题UIForm
是,它会破坏findComponent()
我希望如果我使用prependId
,那么NamingContainer
行为会发生变化,不仅与渲染有关,而且当想要在组件树中搜索组件时也会发生变化。
这里有一个简单的例子:
现在,当我想获取 panelGroup 组件时,我希望将字符串传递"group"
给方法findComponent()
,但它找不到任何东西,我必须"test:group"
改用它。
具体问题是,当将 ajax 与prependId="false"
. ajax 标记期望在属性更新和处理中,值关心命名容器。有点奇怪,当我使用它时prependId="false"
,我必须指定完整的 id 或路径,但没关系。
好吧,这段代码将毫无问题地呈现,但它不会更新 panelGroup,因为它找不到它。将PartialViewContext
仅包含 id"group"
作为 renderIds 的元素。我不知道这是否是预期的,可能是这样,但我不知道代码。findComponent()
现在我们到了方法找不到组件的地步,因为作为参数传递的表达式是"group"
方法期望"test:group"
找到组件的地方。
一种解决方案是编写自己的解决方案,findComponent()
这是我选择处理此问题的方式。在这种方法中,我处理一个组件,它是 aNamingContainer
并且其属性 prependId 设置为 false ,就像普通的一样UIComponent
。UIComponent
对于每个提供 prependId 属性的东西,我都必须这样做,这很糟糕。反射将有助于绕过类型的静态定义,但它仍然不是一个真正干净的解决方案。
另一种方法是在界面中引入 prependId 属性NamingContainer
并改变行为findComponent()
以像上面描述的那样工作。
最后提出的解决方案是更改 ajax 标记的行为以传递整个 id,但这只会解决 ajax 问题,而不是findComponent()
实现背后的编程问题。
您对此有何看法,为什么要这样实施?我不可能是第一个遇到这个问题的人,但是我找不到相关的话题?!
jsf-2 - 在命名容器中获取组件真实 ID 的更好方法
我得到了以下场景:我有几个选项卡(TabView 是一个命名容器),其中一个是 ap:inputText,它显示了一个对话框(位于其他 xhtml 文件中),现在我希望对话框更新 p :inputText ,问题是 p:inputText 的 id 是未知的(JSF为其添加了一些前缀)
我不能在对话框中使用这个 update="hoursReportFrm:comment4Dialog"
ATM 我查看了该站点JSF 的示例:使用组件 ID(id vs clientId)(从 2009 年开始)
并添加了对 inputtext 的绑定,就像这样binding="#{lookup.components.comment4Dialog}"
,在我更改为的对话框的 p:commandButton 中update="#{lookup.clientIds.comment4Dialog}"
它工作得很好,但我正在寻找一种更好的方法,而不需要绑定我以后想要访问的每个组件......
提前谢谢,
jsf - 如何创建不是 NamingContainer 的复合组件
我创建了一个复合组件来替换项目中的 primefaces 弹出窗口。我在生成的 html 中发现了一些非常糟糕的东西,出现了一个奇怪的 id,我找不到这个 id 的开始位置,所以我怀疑这个 id 是由复合组件生成的。我需要删除这个 id 来刷新我需要的内容......那么,有没有办法可以禁用这个组件生成这个 id?
例如:
jsf-2 - 在渲染/更新属性的模板中获取父命名容器的 ID
我有一个模板,在它的定义中我使用了几个表单和按钮。
问题是定义(define)xhtml 文件不知道组件层次结构。
例如,我想在同一个定义文件中以不同的形式更新元素“table2”。
模板插入:
定义我的层次结构的第一级“导航”
模板定义:
在我的定义部分,我不想知道“导航”!
我怎样才能做到这一点?或者我怎样才能向上移动一个命名组件?或者将最高父级完整ID保存在一个变量中?
有时我看到类似的东西:
但是我找不到任何关于这个的信息?JavaEE 6 文档只提到了 @ 关键字。