1

DataContext からオブジェクトを取得し、HTTP ポストで更新するために LINQ で使用できるビルド済みの ModelBinder はありますか?

たとえば、現在、次のコード ブロックがあります。

[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 データ コンテキストを介してデータベースの更新を実行するには、プロジェクト インスタンスを再度取得してから、そのインスタンスを更新する必要があります。

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

Projects テーブル クラスで Attach メソッドを使用しても機能せず、例外がスローされます。

4

3 に答える 3

3

Mike Hadlow の (新しい BSD) SutekiShopの実装を参照してください。

そこには、DataBindAttribute と BindUsingAttribute があり、正しく理解できれば、やりたいことを正確に実行できます。DataBindAttribute.Fetch プロパティを使用して、(HttpPost から) 受信データを LINQ エンティティに再バインドする方法、または再バインドしない方法に注意してください。

ASP.NET MVC と LINQ-To-SQL を使用するプロジェクトの 1 つで、このパターンに従いました。美しく機能します。

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

于 2009-08-18T17:34:16.973 に答える
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 });
}
于 2009-08-14T13:37:30.473 に答える
0

元のプロジェクトを取得してから、更新するプロジェクトで変更されたプロパティで更新し、更新要求を送信する必要があります。

編集

私が見つけたこのコードを試してください:

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)); 
       } 
    } 
} 
于 2009-08-14T13:59:51.010 に答える