将多个存储过程的结果传递给视图

时间:2014-09-01 11:03:51

标签: c# .net sql-server asp.net-mvc stored-procedures

.net处女在这里请原谅我的任何致盲错误。

在我的应用程序中,大部分数据提升都是使用SQL Server存储过程完成的。

从我的控制器中,我能够传递商店程序的结果,如下所示:

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

但是,我希望能够将多个存储过程的结果传递给我的视图。如果我没有使用存储过程,可以使用viewmodels完成,但我很难找到一种方法来使用我的存储过程。

有没有人有任何见解或链接到一个好的解释?谷歌没有提供太多帮助。

干杯

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

在这种情况下双向可行:
你可以创建一个超级模型,并将每个存储过程都放到该模型的元素中! 像这样:
How to edit multiple models in a single Razor View
或者您可以在视图中使用元组:
http://www.dotnetperls.com/tuple
http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx

答案 2 :(得分:0)

除了非常简单的CRUD应用程序之外,ViewModel应该是一个自定义类,它具有视图引擎为浏览器呈现HTML页面所需的数据。

那就是说,你需要为你的情况创建一个足够的ViewModel。问题是您以后需要提供该模型(即设置属性值)。

一种选择是保持数据层和视图模型之间的耦合,并创建一个视图模型,其属性完全是数据层返回的类型。 (我不喜欢这种耦合)。

另一种选择是创建我上面所说的内容:一个完全针对视图需求创建的ViewModel类。在这种情况下,您需要使用诸如AutomapperValue injecter之类的内容来将查询返回的数据复制到ViewModel。任何这些解决方案都能够将数据从源(在本例中为您的存储过程结果)复制到目标(在本例中为viewmodel)。两者都使用约定/配置的组合。它们很容易使用。

您也可以使用LINQ手动完成。您可以使用投影函数Select将结果从原始表单映射和整形到目标类,例如,如下所示:

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