在FormView中找不到名为"xxx.yyy"的属性(嵌套属性的双向绑定)

Vin*_*ent 7 c# asp.net formview objectdatasource

我尝试更新FormView时出现此错误

无法在ObjectDataSource'odsForm'中的DataObjectTypeName属性指定的类型上找到名为"MainContact.FirstName"的属性.

我认为这是因为我在EditTemplate中使用了像这样的文本框

<asp:TextBox Text='<%# Bind("MainContact.FirstName") %>' ID="txtFirstName" runat="server" />
Run Code Online (Sandbox Code Playgroud)

它在文本框中显示正确的文本,但显然它在更新时不起作用.

这是FormView的数据源

<asp:ObjectDataSource ID="odsForm" runat="server" DataObjectTypeName="Helpers.BusinessObjects.EntryItem"
    SelectMethod="GetEntryByEmail" TypeName="Helpers.DataAccessers.EntryHelper"
    UpdateMethod="UpdateEntry">
    <SelectParameters>
        <asp:SessionParameter SessionField="email" Name="email" Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>
Run Code Online (Sandbox Code Playgroud)

这是EntryItem类

 public class EntryItem
    {
        public int Id { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public Person MainContact { get; set; } 
        ...
    }
Run Code Online (Sandbox Code Playgroud)

和人类

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

调试器进入FormView ItemUpdating事件处理程序,但从不进入Helpers.DataAccessers.EntryHelper.UpdateEntry.

我怎么解决这个问题?

Wik*_*hla 1

两种可能的方法。

首先,您可以DataObjectTypeName="Helpers.BusinessObjects.EntryItem"ObjectDataSource. 我从来没有使用过它,绑定总是有效的。

但这可能不会有帮助,因为Bind/Eval可能无法遵循参考文献(Bind("MainContact.FirstName"))。

相反,将其重写为

<%# ((EntryItem)Container.DataItem).MainContract.FirstName #>
Run Code Online (Sandbox Code Playgroud)

缺点是您失去了自动双向装订功能,因此您必须为装订机提供一些帮助。只需将Inserting/Updating处理程序添加到您的 ObjectDataSource 和内部处理程序中:

protected void TheObjectDataSource_Updating( object sender, BlahBlahEventArgs e )
{
    // find the control in the data bound parent
    TextBox txt = (TextBox)YourFormView.FindControl( "txtFirstName" );

    // read the value and add it to parameters
    e.Parameters.Add( "nameofyourparameter", txt.Text );
}
Run Code Online (Sandbox Code Playgroud)