2016-05-13 4 views
-1

したがって、コントローラにリストプロパティUserContext.ServicesListを配信するビューがあるとします。ユーザーは既に既存のリストをすでに持っている可能性があり、変更されたレコードをそのリストに更新したいと考えています。何が最善のアプローチです:コントローラーの動的リストの変更をどのように処理するのですか?

1)リストから削除されたレコードを削除しますか?

2)既存のレコードを更新しますか?

3)新しいレコードを追加しますか?

ありがとうございます!

例クラス

public class UserPage 
{ 
    [Key] 
    public string Id { get; set; } 

    [ForeignKey("Id")] 
    public ApplicationUser User { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string AboutMe { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string AvailableTime { get; set; } 

    public List<Services> ServicesList { get; set; } 

} 

public class Services 
{ 
    [Key] 
    public int ServiceId { get; set; } 

    public string Id { get; set; } 

    [ForeignKey("Id")] 
    public ApplicationUser User { get; set; } 

    public string ServiceName { get; set; } 
} 

例コントローラ

[HttpPost] 
public ActionResult Edit(UserPage UserContext) 
{ 
    if (ModelState.IsValid) 
    { 
     if (UserContext.ServicesList != null) 
     { 
      foreach (var item in UserContext.ServicesList) 
      { 
       // What do I do here? 
      } 
     } 
     db.Entry(UserContext).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(UserContext); 
} 
+0

'ServiceId'の値が' 0'ならば、その新しいので、追加します。それ以外の場合は更新するか、または削除します。 ?)。あなたの以前の(今削除された)質問に基づいて、あなたはajaxを使ってデータベースから項目を削除していたはずであることを示唆するビューのdeleteイベントを処理していました。 –

+0

@StephenMueckeプロパティはありません。あなたは削除を識別するためのより良い方法を知っていますか? – whimzee

+0

'IsDeleted'プロパティを持つビューモデルを使用し、ビューで非表示の入力を生成します。関連する 'Delete'リンクをクリックすると、その値を '' True ''に変更します(行を非表示にしますが、DOMから削除しないでください)また、' ServiceId'プロパティの符号を変更します –

答えて

0

私はServiceListのすべてのレコードを削除し、それはそれだけで物事をシンプルに保つ

[HttpPost] 
public ActionResult Edit(UserPage UserContext,int id) 
{ 
    if (ModelState.IsValid) 
    { 
     if (UserContext.ServicesList != null) 
     { 
      var dbList = db.Services.Where(x=>x.User.Id == id); 
      foreach(var item in dbList){ 
       db.Services.Remove(item) 
      } 
      foreach (var item in UserContext.ServicesList) 
      { 
       db.Services.Add(item); 
      } 
     } 
     db.Entry(UserContext).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(UserContext); 
} 

のような形のポストから来て改めてレコードを追加します。それ以外の場合は、毎回、削除されたレコードの数、新規のレコードの数、および新しいレコードの数を比較する必要があります。簡単で簡単な方法は、古いリストを削除してもう一度追加することです。私はこのパターンをEFだけでなく普通のADO.Netでも見てきました

0

あなたが既存のレコードを更新する必要はありません。だから、単に削除したものを削除することができます&新規追加。

foreach (var item in UserContext.ServicesList) 
{ 
    if(item.ServiceId == exists) 
    { 
     //Check the values & Update if needed else leave 
    } 
    else 
    { 
     //Remove or Add 
    } 
} 
+0

これは良い点ですが、エントリが追加されたか削除されたかをどうやって判断するのですか? – whimzee

+0

UserContext.ServicesListレコードをデータベースで確認する必要がありますか? –

関連する問題