0

私はASPXページやドラッグアンドドロップなどの大ファンではありません。私は単一のDefault.aspxでポータルを構築していますが、他のすべてのものは、他の開発者がコンパイル済みdllに構築でき、ユーザーがポータルに機能を追加するためにポータルにアップロードできるカスタムWebパーツコントロールまたはサーバーコントロールです。私はentitydatasourceを使用してDetailsViewのクラッド操作と戦ってきました。ドラッグアンドドロップでtest.aspxページを作成しましたが、すべて正常に機能しましたが、100%コードが遅れているため、何も起こりません。エラーは表示されませんが、データはデータベースに保持されていません。詳細ビューのonUpdatingイベントをキャッチしようとしましたが、イベントが発生し、送信されたデータを列挙できましたが、データベースに保持されないのはなぜですか?誰かがこれを手伝ってくれることを願っています。

これが私のコードです(コードビハインドからすべてを作成し、すべてをWebパーツに移動する前に、テスト目的でページのプレースホルダーに追加しようとしています):

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();
        }
    }
}
4

1 に答える 1

0

私はあなたがしなければならないことは追加することだと思います:

OnContextCreating = "XXXXDatasource_OnContextCreating" OnContextDisposed = "XXXXDatasource_OnContextDisposed"

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に正しく設定されます。

少なくともそれは私がベストプラクティスとして読んだものです(ページリクエストごとに1つのオブジェクトコンテキストも検索します)

于 2011-03-28T22:23:19.453 に答える