2009-08-14 6 views
1

DataContextからオブジェクトを取得してHTTP投稿で更新するためにLINQで使用できる事前構築済みModelBinderはありますか?例えばASP.NET MVC、LINQ、ModelBinders

、現在私はこのコードブロックがあります実際にLINQを介してデータベースの更新を行うために

[AcceptVerbs (HttpVerbs.Post)] 
public ActionResult Edit (Project project) 
{ 
    var projectService = Factory.GetService<IProjectService>(); 
    project = projectService.GetProject (project.ProjectId); 

    UpdateModel<Project> (project); 

    if (!ModelState.IsValid) 
     return View (project); 

    project = projectService.SaveProject (project); 

    return RedirectToAction ("Details", new { id = project.ProjectId }); 
} 

(IProjectServiceはLINQデータコンテキストへの呼び出しをラップ)

をデータコンテキストでは、プロジェクトインスタンスを再度取得し、そのインスタンスを更新する必要があります。

最初にデータコンテキストから取得せずにプロジェクトインスタンスを保存しようとすると、何もデータベースに書き戻されません。LINQデータコンテキストは何もしないオブジェクトを何も知らないためですそれと。

ProjectsテーブルクラスのAttachメソッドを使用するとbtwのいずれも機能しません。例外がスローされます。

答えて

3

を。

DataBindAttributeとBindUsingAttributeがあります。正しく理解すれば、やりたいことを正確に実行できます。 DataBindAttribute.Fetchプロパティを使用して、HttpPostからLINQエンティティに着信データをリバインドするかどうかを確認します。

ASP.NET MVCとLINQ-To-SQLを使用している私のプロジェクトで、このパターンに従いました。それは美しく動作します。ここで

はソースです: http://www.google.com/codesearch?hl=en&lr=&q=DataBind+package%3Ahttp%3A%2F%2Fsutekishop.googlecode.com&sbtn=Search

+0

それはちょうど、ロバートに感謝です! – Kieron

+0

SutekiShopには素晴らしいコードがたくさんありますので、うれしいです。 –

0

私はこのメソッドに渡すプロジェクトは、あなたがUpdateModelを実行したいと思うものだと思いますか?

それ以外の場合は、新しい値ではなく既存の値で更新しようとしています。ただ、思考

ダン

コードは、あなたがプロジェクトで変更されたプロパティでそれを更新するために、そして、そうであるように、元のプロジェクトを取得する必要が

[AcceptVerbs (HttpVerbs.Post)] 
public ActionResult Edit (Project project) 

    UpdateModel<Project> (project); 

    if (!ModelState.IsValid) 
      return View (project); 

    var projectService = Factory.GetService<IProjectService>(); 

    project = projectService.SaveProject (project); 

    return RedirectToAction ("Details", new { id = project.ProjectId }); 
} 
+0

プロジェクトとないprojectToUpdateは、私は非常によく説明していないModelBinder –

+0

問題を、使用して一つであり、バインダーから来ているプロジェクトインスタンスは離れて、すべてが順調と良いということです実際には、MVC FWによって構築され、DataContextから取得されなかったことになります。そのインスタンスを更新するとき、DataContextは基本的に何もしません。おそらく、そのオブジェクトの何も知らないからです。 – Kieron

0

下に切り出します更新要求を送信するように更新します。

EDIT

私が見つけたこのコードを試してください:あなたはマイクHadlowのの(新しいBSD)SutekiShopに実装をご覧ください

public static void CloneProperties(this object origin, ref object destination) 
{ 
    if (destination == null) throw new ArgumentNullException("destination", "Destination object must first be instantiated."); 
    foreach (var destinationProperty in destination.GetType().GetProperties()) 
    { 
     if (origin != null && destinationProperty.CanWrite) 
     { 
      origin.GetType().GetProperties().Where(x => x.CanRead && (x.Name == destinationProperty.Name && x.PropertyType == destinationProperty.PropertyType)) .ToList() .ForEach(x => destinationProperty.SetValue(destination, x.GetValue(origin, null), null)); 
     } 
    } 
} 
+0

ええ、それは私がやっていることです - 私が望むのは、私のためにそれを行うModelBinderを作成することです...単純に、毎回コントローラで取得する必要はありません。 後で別のORMに変更した場合、追加の取得は不要になります。私がバインダーで行う必要があるのは、元のファイルを削除/復元することだけです。何かご意見は? – Kieron

+0

http://msdn.microsoft.com/en-us/library/bb896248.aspx – Gregoire

+0

@Gregorie、私はしばらく前にAttachメソッドを使ってみましたが、オブジェクトに関する例外がスローされました。(これは、それはPKです)。 – Kieron

関連する問題