2017-04-21 10 views
0

FormViewのページに記事をデータベースに登録できるフォームがあるとします。ユーザーは番号、説明などのプロパティを入力できます。EntityDataSourceを使用します。ASP.NET WebFormsは、実行時に更新処理に挿入操作を変更します

私は挿入/更新操作を実行できます。問題は、いくつかのケースで(正確に同じNumberのオブジェクトのIsDeletedプロパティが設定されている場合)、Insert操作を取り消して、代わりにUpdateを実行したいとします。そうするために、私はそのようなことを開始しました:

protected void ArticleFormView_ItemInserting(object sender, FormViewInsertEventArgs e) 
{ 
    string articleNo = e.Values[ "Number" ].ToString(); 

    // ...some other things... 

    if (this.ShouldUpdateInsteadOfInsert(articleNo)) 
    { 
     e.Cancel = true; //cancel insert 
     this.ArticleFormView.ChangeMode(FormViewMode.Edit); 
     this.ArticleFormView.UpdateItem(false); 
     return; 
    } 
} 

これが正常Insertをキャンセルし、Updateを起動します。しかし、ArticleFormView_ItemUpdatingのイベントハンドラのプロパティNewValuesにはFormViewUpdateEventArgsというオブジェクトがあり、ユーザによって入力されたものではありません。

protected void ArticleFormView_ItemUpdating(object sender, FormViewUpdateEventArgs e) 
{ 
    // e.NewValues["Number"] - not the same as 
    // e.Values["Number"] from ArticleFormView_ItemInserting 
} 

このように動作させる可能性はありますか?

手動でItemInsertingEntityオブジェクトを作成し、すべての値を手動で割り当てることができますが、オブジェクトには200以上のフィールドがありますので、私はより良いアプローチを探しています。

私はこの場合に良い解決策をお見逃しなく。

答えて

0

さらに優れた解決策をご存知の方は、お答えください。

私はリフレクションを使って値をマップするコードを書くことができました。私はUpdateメソッドを呼び出さないが、ItemInsertingで手動でデータベース更新を実行する。

protected void ArticleFormView_ItemInserting(object sender, FormViewInsertEventArgs e) 
{ 
    string articleNo = e.Values[ "Number" ].ToString(); 

    // ...some other things... 

    if (this.ShouldUpdateInsteadOfInsert(articleNo)) // (property IsDeleted = true) 
    { 
     // cancel insert 
     e.Cancel = true; 

     using (StoreEntities ctx = new StoreEntities()) 
     { 
      // get "deleted" article 
      var restoredArticle = ctx.Articles.First(i => i.Number == articleNo); 

      // "restore" it 
      restoredArticle.IsDeleted = false; 

      var type = restoredArticle.GetType(); 
      foreach (var propertyInfo in type.GetProperties()) 
      { 
       if (propertyInfo.CanWrite) 
       { 
        // ignore some values that should not be changed 
        if (propertyInfo.Name == "Number" || propertyInfo.Name == "IsDeleted" || propertyInfo.Name == "ID" || propertyInfo.Name == "EntityKey") 
         continue; 

        // update other properties, handle non convertible types separately 
        if (propertyInfo.PropertyType == typeof(int)) 
         propertyInfo.SetValue(restoredArticle, e.Values[ propertyInfo.Name ] == null ? (int?)null : Convert.ToInt32(e.Values[ propertyInfo.Name ]), null); 
        else if (propertyInfo.PropertyType == typeof(decimal)) 
         propertyInfo.SetValue(restoredArticle, e.Values[ propertyInfo.Name ] == null ? (decimal?)null : Convert.ToDecimal(e.Values[ propertyInfo.Name ]), null); 
        else 
         propertyInfo.SetValue(restoredArticle, e.Values[ propertyInfo.Name ], null); 
       } 
      } 
      ctx.SaveChanges(); 
     } 

     return; 
    } 
} 
関連する問題