2012-07-09 39 views
-1

我有一個獲取,保存和創建操作的控制器。這些操作將參數作爲項目類型。這只是一個字符串,用於指定我們正在處理的項目的類型。如何從使用RedirectToAction執行的方法返回對象?

每個這些項目類型都有一個子控制器,每個子控制器都實現了具有Get,Save和Create方法的子控制器接口(IChildController)。

每個子控制器都根據其類型(ItemTypeController)進行命名。當我從我的父控制器獲得一個項目,我可以做這樣的:

Get(string itemType, int id) 
{ 
    return RedirectToAction("Get", itemType, new { id }); 
} 

在孩子控制器GET方法有一個ActionResult返回類型(返回Partival查看)所以這個工作沒有問題。

但是,當我保存一個項目時,所有的子項都被創建,然後返回到父項對象並存儲在其中,這樣就可以對父項進行保存(並且NHibernate將處理級聯記錄) 。

如何從這些方法中返回對象,而無需首先實例化所有子控制器。例如,我希望能夠調用保存(ITEMTYPE,項目)

Save(string itemType, Item item) 
{ 
    return RedirectToAction("Save", itemType, new { item }); 
} 

,然後我們會找到合適的子控制器(itemTypeController),執行方法保存(項目),然後返回項目(項目)回到父控制器。

Save(Parent parent) 
{ 
    IRepository<Parent> _parent; 
    var item = new Parent(); 
    item.Id = parent.Id; 
    item.Children = parent.Children.AddAll(parent.Children.Select(Save(parent.ChildType)); // save each child and add it to the parent's child collection 
    return _parent.Save(item); 
} 

Save(Child child) 
{ 
    IRepository<Child> _child; 
    var item = new Child(); 
    item.Id = child.Id; 
    return _child.Save(item); 
} 

達到這個目標的最佳解決方案是什麼?預先感謝您的幫助。

編輯

我怎麼會去複雜的對象轉換成的ViewModels。例如,一個包含Child類型子對象的Parent對象。

在ParentTypeController我們:

ParentViewModel ToViewModel(Parent parent) 
{ 
    var model = new ParentViewModel(); 
    model.Id = parent.Id; 
    model.Children = parent.Children.Select(ToViewModel); //Use the ToViewModel method in the ChildTypeController 
    return model; 
} 

ChildTypeController:

所有的
ChildViewModel ToViewModel(Child child) 
{ 
    var model = new ChildViewModel(); 
    model.Id = child.Id; 
    return model; 
} 
+0

您的第一個問題提出了一件事,而您的編輯提出了完全不同的問題。這些應該是分開的。 – Yuck 2012-07-09 17:11:20

+0

@ bfir3:你設法讓它工作嗎?你能否批准下面的答案之一? – 2012-07-12 12:48:28

回答

0

首先,你應該使用RedirectToAction()作爲一種普遍現象,你是這樣的。從MSDN

返回一個HTTP 302響應於所述瀏覽器,這會導致瀏覽器 作出GET請求到指定的操作。

所以對用戶進行應用程序的每一個請求,你迫使他們實際上使!如果你想使用重載的方法,你可以在你的控制器中這樣做。您不需要導致瀏覽器重定向。

我想一旦你解放了自己的這種模式,其餘的就會自然出現。在我自己的項目中,我發現通常最好分兩步執行數據庫操作 - (1)創建或更新,然後(2)再次從數據庫請求「新鮮」對象狀態。

0

認爲您在定義正確的抽象時遇到了問題。不要將控制器用於這種行爲或交互。你已經擁有一個倉庫,所以讓它完成繁重的工作。

你不應該從動作中調用動作,除非有很好的理由。 http請求映射到(功能性)操作。一個動作可以使用模型(在Mvc中)並使用返回值來創建響應。

不確定爲什麼你想要或需要你的控制器中的這個父/子層次結構。也許你可以解釋爲什麼你需要它。

編輯 嘗試AutoMapper「在.NET中以公約爲基礎對象的對象映射器」。將對象圖轉換爲其他對象圖。適用於簡單和複雜的轉換。

相關問題