2011-03-26 50 views
0

我不是ASPX頁面的拖拉式拖放等。我使用一個Default.aspx構建門戶,其他所有東西都是自定義Web部件控件或服務器控件,其他開發人員可以在編譯的dll中構建,並且用戶可以自行上傳到門戶以向門戶添加功能。我一直在使用entitydatasource與DetailsView的crud操作作鬥爭。我做了一個test.aspx頁面拖放和一切正常,但100%的代碼背後,什麼都沒有。沒有錯誤顯示,但數據沒有被保存到數據庫。我嘗試捕獲detailsview的onUpdating事件,並且是事件被解僱了,我可以枚舉提交的數據,但爲什麼它沒有被持久化到數據庫?希望有人可以幫助。在自定義服務器控件中使用DetailsView和EntityDataSource進行CRUD操作

這裏是我的代碼(試圖創造一切從代碼隱藏,並將它們添加到佔位符在頁面上只是用於測試目的之前,我謹一切網絡的一部分):

public partial class Test : System.Web.UI.Page 
{ 
    private EntityDataSource eds = new EntityDataSource();  
    public DetailsView dtlview = new DetailsView();  

    protected void Page_Load(object sender, EventArgs e) 
    { 

     //Initialize Datasource    
     eds.ConnectionString = "name=DBEntities"; 
     eds.DefaultContainerName = "DBEntities"; 
     eds.EnableDelete = true; 
     eds.EnableFlattening = false; 
     eds.EnableInsert = true; 
     eds.EnableUpdate = true; 
     eds.EntitySetName = "EmailAccounts";    
     Controls.Add(eds);//I don't know if this is necessary   

     //Create DetailsView and configure for inserting on default 
     dtlview.DataSource = eds; 
     dtlview.AutoGenerateInsertButton = true; 
     dtlview.AutoGenerateDeleteButton = true; 
     dtlview.AutoGenerateEditButton = true; 
     dtlview.AutoGenerateRows = false; 
     dtlview.DefaultMode = DetailsViewMode.Insert; 
     dtlview.AllowPaging = true; 
     dtlview.DataKeyNames = new string[] { "ID" }; 
     dtlview.AllowPaging = true; 

     //Create fields since autogeneraterows is false 
     BoundField bfID = new BoundField(); 
     bfID.DataField = "ID"; 
     bfID.HeaderText = "ID:"; 
     BoundField bfUserID = new BoundField(); 
     bfUserID.DataField = "UserID"; 
     bfUserID.HeaderText = "User ID:"; 
     BoundField bfDisplayName = new BoundField(); 
     bfDisplayName.DataField = "DisplayName"; 
     bfDisplayName.HeaderText = "Display Name:"; 
     BoundField bfEmailAddress = new BoundField(); 
     bfEmailAddress.DataField = "EmailAddress"; 
     bfEmailAddress.HeaderText = "Email:"; 
     BoundField bfPassword = new BoundField(); 
     bfPassword.DataField = "Password"; 
     bfPassword.HeaderText = "Password:"; 
     BoundField bfOutgoingServer = new BoundField(); 
     bfOutgoingServer.DataField = "OutgoingServer"; 
     bfOutgoingServer.HeaderText = "Outgoing server:"; 
     BoundField bfIncomingServer = new BoundField(); 
     bfIncomingServer.DataField = "IncomingServer"; 
     bfIncomingServer.HeaderText = "Incoming Server:"; 
     CheckBoxField chkfIsDefault = new CheckBoxField(); 
     chkfIsDefault.DataField = "IsDefault"; 
     chkfIsDefault.HeaderText = "Is Default?"; 

     dtlview.Fields.Add(bfID); 
     dtlview.Fields.Add(bfUserID); 
     dtlview.Fields.Add(bfDisplayName); 
     dtlview.Fields.Add(bfEmailAddress); 
     dtlview.Fields.Add(bfPassword); 
     dtlview.Fields.Add(bfOutgoingServer); 
     dtlview.Fields.Add(bfIncomingServer); 
     dtlview.Fields.Add(chkfIsDefault); 

     dtlview.DataBind(); 

     //Events handling for detailsview 
     dtlview.ItemInserting += dtlview_ItemInserting; 
     dtlview.ItemInserted += dtlview_ItemInserted; 
     dtlview.ModeChanging += dtlview_ModeChanging;   

     //Add controls to place holder    
     PlaceHolder2.Controls.Add(dtlview); 
    }   
    protected void dtlview_ItemInserting(object sender, DetailsViewInsertEventArgs e) 
    { 
     e.Values["UserID"] = GetCurrentUserID();   
    } 
    protected void dtlview_ItemInserted(object sender, DetailsViewInsertedEventArgs e) 
    { 

    } 
    protected void dtlview_ModeChanging(object sender, DetailsViewModeEventArgs e) 
    { 
     dtlview.ChangeMode(e.NewMode); 
     if (e.NewMode != DetailsViewMode.Insert) 
     { 
      dtlview.DataSource = eds; 
      dtlview.DataBind(); 
     } 
    } 
} 

回答

0

我認爲你必須做的是什麼添加:

OnContextCreating = 「XXXXDatasource_OnContextCreating」 OnContextDisposing = 「XXXXDatasource_OnContextDisposing」

要將EntityDataSource。

然後在你的代碼:

protected void XXXXDatasource_OnContextCreating(object sender, EntityDataSourceContextCreatingEventArgs e) 
{ 
    e.Context = DBEntities.Entities; 
} 

protected void XXXXDatasource_OnContextDisposing(object sender, EntityDataSourceContextDisposingEventArgs e) 
{ 
    e.Cancel = true; 
} 

這樣一來,你的ObjectContext的正確設置爲你的DetailsView則使用EntityDataSource。

至少這是我讀的最佳實踐(還查找每個頁面請求一個對象上下文)

+0

塞巴斯蒂安感謝,我會嘗試這一點,並張貼我的經驗。 – Steven 2011-03-29 11:56:43

+0

謝謝塞巴斯蒂安,我對遲到的迴應表示歉意。這在我提出的問題以及我的項目的其他一些領域非常有用。 – Steven 2011-04-12 10:42:53

相關問題