2014-09-01 35 views
1

.net處女在這裏,請原諒我的任何致盲錯誤。將多個存儲過程的結果傳遞給視圖

在我的應用程序中,大部分數據提取都是使用SQL Server存儲過程完成的。

從我的控制,我能夠通過存儲過程的結果,就像這樣:

var vehiModels = db.spVehicleGetModels(ID_make, false, true, ID_country); 
return View(vehiModels.ToList()); 

不過,我希望能夠到的多個存儲過程的結果傳遞給我的看法。如果我沒有使用存儲過程,這可以通過viewmodels來完成,但我正在努力尋找一種使用我的存儲過程來做到這一點的方法。

有沒有人有任何見解或鏈接到一個很好的解釋? Google沒有提供太多幫助。

乾杯

+0

您正在使用什麼ORM? – 2014-09-01 11:11:40

+0

您的所有存儲過程是否對結果集具有相同的「形狀」? – 2014-09-01 11:12:24

+1

如果第二行是'return View(vehiModels.ToList());'? – AndreySarafanov 2014-09-01 11:12:58

回答

2

一個ViewModel簡單地保存所有數據的視圖的需求。製作課程以保存視圖需要的車輛集合和任何其他數據並將其傳遞到頁面。然後,您可以用ViewModel強制輸入頁面。

public class VehicleViewModel 
{ 
    public ICollection<VehicleModel> VehicleModels { get; set; } 
} 

public ActionResult Vehicles(int? makeId, int? countryId) 
{ 
    if(!makeId.HasValue || !countryId.HasValue) 
    { 
     RedirectToAction("Error"); 
    } 

    var models = db.spVehicleGetModels(makeId, false, true, countryId); 
    var viewModel = new VehicleViewModel { VehicleModels = models.ToList() }; 
    return View(viewModel); 
} 
+0

謝謝。你能詳細介紹一下嗎?比方說,我想將一列國家(也是從存儲過程中檢索到的)連同車輛列表一起傳遞給頁面。我需要爲國家和車輛創建基本模型嗎?在VehicleViewModel中,我會有另一個國家的icollection? – Fraser 2014-09-01 12:56:03

+1

是的,你可以添加另一個屬性來保存國家。 – Romoku 2014-09-01 20:00:58

0

除了形式非常簡單的CRUD應用程序,視圖模型應具有通過視圖引擎渲染HTML頁面的瀏覽器所需要的數據的自定義類。

這就是說,你需要爲你的情況創建一個合適的ViewModel。問題是您以後需要提供該模型(即設置屬性值)。

一種選擇是保持數據層和視圖模型之間的耦合,並創建一個視圖模型,其屬性與數據層返回的類型完全相同。 (我不喜歡這種耦合)。

另一種選擇是創建我剛纔所說的:一個ViewModel類正是爲視圖需求而創建的。在這種情況下,您需要使用諸如AutomapperValue injecter之類的語句將查詢返回的數據複製到ViewModel。任何這些解決方案都能夠將數據從源(在這種情況下,您存儲的proc結果)複製到目標(在本例中爲視圖模型)。兩者都結合使用約定/配置。它們很容易使用。

而且你也可以使用LINQ手工完成。你可以映射,和形狀,從原來的形式使用投影funcion Select一個目標類的結果,例如,像這樣:

StoredProdResult.Select(spr => new DestinationClass { 
    DestinationProperty1 = spr.OriginalColumn1, 
    DestinationProperty2 = spr.OriginalColumn4, 
    DestinationProperty3 = spr.OriginalColumn2 + " " + spr.OriginalColumn3 
}).ToList()