2014-09-01 89 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() 
相关问题