2011-03-26 6 views
0

저는 ASPX 페이지를 끌어다 놓는 것과 같은 끌어다 놓기 등의 작업을하지 않습니다. 하나의 Default.aspx로 포털을 구축하고 있으며 다른 모든 것들은 다른 개발자가 컴파일 된 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

+0

Sebastian에게 감사의 말을 전합니다. 이것은 제가 물어 본 질문과 프로젝트의 다른 영역에서 매우 도움이되었습니다. – Steven