C# 如何通过用户控件公开ITemplate?
为了简化某些表单的创建,我们使用了一个位于用户控件内部的修改过的Formview控件。此用户控件用于网格和FormView,您可以在网格中选择项目,FormView以查看/编辑模式显示:C# 如何通过用户控件公开ITemplate?,c#,asp.net,C#,Asp.net,为了简化某些表单的创建,我们使用了一个位于用户控件内部的修改过的Formview控件。此用户控件用于网格和FormView,您可以在网格中选择项目,FormView以查看/编辑模式显示: <I2CL:Grid runat="server" ID="Grid" OnSelecting="Selecting" ShowCreate="true" /> <I2:Modal ID="SFModal" runat="server" UpdateMode="Conditional">
<I2CL:Grid runat="server" ID="Grid" OnSelecting="Selecting" ShowCreate="true" />
<I2:Modal ID="SFModal" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<I2:FormView runat="server" ID="FVSubForm" DefaultMode="Edit" DataSourceID="DSSubForm" />
<I2:ILDataSource ID="DSSubForm" runat="server" />
</ContentTemplate>
</I2:Modal>
这样做的问题是,由于引用是指向用户控件中的对象,因此与FormView中用于更改的字典项关联的EditItemTemplate引用将被销毁,因此当您将更改字典发送到数据源时,每次回发时,它们都是空的
这里使用的I2:ILDataSource是最接近ObjectDataSource的自定义实现。它直接调用页面中的GetEntity()
(本例中为用户控件)和UpdateEntity(obj Entity)
来保存,而不是一般的对象调用。由于这是一个非常特殊的场景,我们可以消除ObjectDataSource中90%的代码
我想做的是将
中的
直接指向
内部的
。这是可能的,还是有人有其他路线的建议
注意:我尝试将FVSubForm上的EditItemTemplate作为代理属性公开,但这不起作用,因为该属性是在创建子控件之前在用户控件上设置的,因此FVSubForm为null。如果可以解决这个问题,我当然洗耳恭听。您需要做的一件事是将ITemplate属性标记为支持双向数据绑定: [TemplateContainer(typeof(FormView),系统.组件模型.绑定方向.双向)] 否则,ASP.NET将无法为允许Bind()表达式工作的页面生成正确的代码 我不确定这是否就是你所需要的,但那是值得尝试的
David感谢您的建议……但情况是:用户控件中的ITemplate本身没有绑定,任何绑定都是分配给FormView控件上的ITemplate的……它设置了相应的绑定属性。我还是试过了,但最终结果没有什么不同(返回空白更新值),虽然这不是直接问题,这是一个绑定代理没有传播,用户控件绑定到的ITemplate没有正确支持双向绑定…因为网格不是直接可编辑的,我从未注意到这个Eval()只有下面的一切都在发生。谢谢大卫,赏金指向你!谢谢你,尼克。我希望我们将尝试在由于ITemplate未正确标记而无法执行任何操作的情况下使用Bind()作为错误条件。如果您感到好奇,请查看为带有和不带双向标志的页面生成的代码。有了这个标志,您将看到一个全新的ExtractValues方法出现,它具有使Bind()工作的所有逻辑。为了安全起见,我们在表单中使用的几个控件的基类中添加了一个仅限调试模式的爬网,以查看它们的父容器……如果它们找到一个不是双向绑定的模板,它将在将来的页面上向我们发出警告。谢谢David,这将有助于我们防止将来出现与此相关的任何问题。
<I2C:TabGrid ID="TG" runat="server" Property="ParentProperty">
<Columns>
<I2:Column Header="Column 1" DataSource="Column1" />
<I2:Column Header="Column 2" DataSource="Column2" />
</Columns>
<EditItemTemplate>
<I2Form:Dropdown ID="Col1" runat="server" SelectedValue='<%# Bind("Column1") %>' List="Column1Options" />
<I2Form:Textbox ID="Col2" runat="server" Text='<%# Bind("Column2") %>' />
</EditItemTemplate>
</I2C:TabGrid>
[PersistenceMode(PersistenceMode.InnerProperty),
TemplateContainer(typeof(FormView))]
public ITemplate EditItemTemplate { get; set; }
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
FVSubForm.EditItemTemplate = EditItemTemplate;
}