1

我正在嘗試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事件觸發爲止,還是我完全錯誤?

+0

唷,這是一個漫長的。抱歉!希望你能夠理解它。 – JoshJordan 2009-07-03 14:32:16

回答

1

你說得對,它很長,但包括一些代碼JIC的榮譽。

看起來很明顯,你不能用普通的DataBinding做到這一點。我並不太熱衷於在會話中存儲此內容,但我確實知道您不需要回發。

您可能想要做的就是設置一個Ajax調用,以便您可以將新記錄(或您的記錄更改)粘貼到DataContext中。提交表單時,您可以在DataContext上調用SubmitChanges。

+0

閱讀+1,並給我一些連貫的觀點:)你提到你不太喜歡使用這個會話,說實話,我也不是。我寧願有一個原子請求 - 關於如何處理它的任何想法?愛阿賈克斯的想法。 – JoshJordan 2009-07-03 20:29:07

+0

那麼,Ajax調用將允許您對DataContext進行「更新此成員資格」調用,而不需要完整的回發。 Ajax可以通過其中一個Ajax腳本處理程序控件/面板進行處理。對不起,我沒有資格更詳細地回答你的問題。我幾個月前就以這種方式構建了一個原型,但感到沮喪並轉而使用ASP.NET MVC。在MVC中,這可以通過AJAX調用或JSON調用來處理,並直接在C#類中實現特定的方法。 – 2009-07-03 20:43:53

1

對我來說似乎Josh認爲,試圖從教師成員網格內管理你的多對多關係並不是正確的方法。事實上,我無法真正想象如何在網格內工作,我是不會感到驚訝,你是迷失:)

更好地使用'細節'頁面的上下文是=一個教師成員,並提供一個'雙列表'界面的師成員維護。這將包括2個列表。

右側列表顯示教員已經成爲成員的所有分部(DivisionMembership行,其中FacultymemberId =上下文ID),左側列表將顯示所有其餘的分部。然後,您可以提供「>>」和「< <」按鈕之間的列表中添加/從部門刪除學部委員(插入/刪除DivisionMemberships行)

邁克爾