Linq to SQL的分层数据绑定
我正在尝试Linq To SQL的一种相当简单的数据绑定方案。Linq to SQL的分层数据绑定
我有FacultyMembers的表,其模式看起来是这样的:
- FacultyMemberID - 诠释PK
- 名称 - 为nvarchar
- UniversityID - 诠释FK到大学表
等等。还有其他各种字符串属性。
我生成LTS数据类。我在页面上放置了一个LinqDataSource和一个GridView,为两者都启用了更新和删除功能,而且我很快乐。没有代码,我可以更新我的字符串属性。在UniversityID上使用DropDownList进行一些操作,我也可以更新该一对多关系。好极了。
现在,让我说我扔在一个多对多的映射表。让我们说分部会员,它将教职员工映射到分部。 DivisionMembership使用简单而明显的模式:
- FacultyMemberID - 诠释PK,FK到FacultyMembers表
- DivisionID - 诠释PK,FK到分部表现在
,当我走了一排我GridView到EditMode中,我遇到了一个问题,因为我不知道如何更新多对多关系。我讨论了几个替代方法,现在我试图让ListView在那里工作。我正在做这样的事情:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
AllowPaging="True" AllowSorting="True" PageSize="25" DataKeyNames="FacultyMemberID" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:TemplateField HeaderText="University" SortExpression="UniversityID">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("University.Name") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="DropDownList2" runat="server"
DataSourceID="LinqDataSourceUniversities" DataTextField="Name"
DataValueField="UniversityID" SelectedValue='<%# Bind("UniversityID") %>'>
</asp:DropDownList>
<asp:LinqDataSource ID="LinqDataSourceUniversities" runat="server"
ContextTypeName="NYDERHE.NYDERHEDataClassesDataContext"
Select="new (UniversityID, Name)" TableName="Universities">
</asp:LinqDataSource>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Division">
<EditItemTemplate>
<asp:ListView ID="ListView1" runat="server"
InsertItemPosition="LastItem" DataSource='<%# Eval("DivisionMemberships") %>'><ItemTemplate>
<li style="">FacultyMemberID:
<asp:Label ID="FacultyMemberIDLabel" runat="server"
Text='<%# Eval("FacultyMemberID") %>' />
<br />
DivisionID:
<asp:Label ID="DivisionIDLabel" runat="server"
Text='<%# Eval("DivisionID") %>' />
<br />
Division:
<asp:Label ID="DivisionLabel" runat="server" Text='<%# Eval("Division") %>' />
<br />
FacultyMember:
<asp:Label ID="FacultyMemberLabel" runat="server"
Text='<%# Eval("FacultyMember") %>' />
<br />
<asp:Button ID="DeleteButton" runat="server" CommandName="Delete"
Text="Delete" />
</li>
</ItemTemplate>
</asp:ListView>
</EditItemTemplate>
等等。上面的一些喋喋不休,但ListView是相当详细的,所以我不想超载的页面。
事情,这里要注意:
- 对于我的大学联合,我使用的项目一个新的LinqDataSource和查询的WHERE的UniversityID匹配,则绑定新UniversityID(DDL值)与FacultyMember,而对于DivisionMemberships,我直接绑定到属性(如描述here)
- 我使用DataBinder。 Bind() for UniversityID,而我使用DataBinder。 Eval() for DivisionMemberships。
如果我切换到DivisionMemberships的Bind(),我得到一个NotSerializableException的EntitySet。如果我坚持使用Eval(),我必须自己为ListView编写OnDelete和OnInsert方法,并且我不想删除或插入DivisionMemberships,直到整个FacultyMember行退出EditMode。我可能会创建一个DataContext并将其粘贴到会话中,因为我没有其他方法来标记DivisionMemberships的更新。
我认为这种情况很容易启用,但我迷路了。有关从哪里出发的建议?具体来说,我应该与Bind()搏斗并尝试使EntitySet可序列化,那么我是否应该咬紧牙关,写上面描述的用于在会话中存储DataContext的有点黑客代码,直到OnRowUpdating事件触发为止,还是我完全错误?
你说得对,它很长,但包括一些代码JIC的荣誉。
看起来很明显,你不能用普通的DataBinding做到这一点。我并不太热衷于在会话中存储此内容,但我确实知道您不需要回发。
您可能想要做的就是设置一个Ajax调用,以便您可以将新记录(或您的记录更改)粘贴到DataContext中。提交表单时,您可以在DataContext上调用SubmitChanges。
阅读+1,并给我一些连贯的观点:)你提到你不太喜欢使用这个会话,说实话,我也不是。我宁愿有一个原子请求 - 关于如何处理它的任何想法?爱阿贾克斯的想法。 – JoshJordan 2009-07-03 20:29:07
那么,Ajax调用将允许您对DataContext进行“更新此成员资格”调用,而不需要完整的回发。 Ajax可以通过其中一个Ajax脚本处理程序控件/面板进行处理。对不起,我没有资格更详细地回答你的问题。我几个月前就以这种方式构建了一个原型,但感到沮丧并转而使用ASP.NET MVC。在MVC中,这可以通过AJAX调用或JSON调用来处理,并直接在C#类中实现特定的方法。 – 2009-07-03 20:43:53
对我来说似乎Josh认为,试图从教师成员网格内管理你的多对多关系并不是正确的方法。事实上,我无法真正想象如何在网格内工作,我是不会感到惊讶,你是迷失:)
更好地使用'细节'页面的上下文是=一个教师成员,并提供一个'双列表'界面的师成员维护。这将包括2个列表。
右侧列表显示教员已经成为成员的所有分部(DivisionMembership行,其中FacultymemberId =上下文ID),左侧列表将显示所有其余的分部。然后,您可以提供“>>”和“< <”按钮之间的列表中添加/从部门删除学部委员(插入/删除DivisionMemberships行)
迈克尔
唷,这是一个漫长的。抱歉!希望你能够理解它。 – JoshJordan 2009-07-03 14:32:16