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

本文关键字:一个 视图 存储过程 结果 | 更新日期: 2023-09-27 18:20:15

.net virgin在这里,所以请原谅我的任何盲目错误。

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

从我的控制器,我能够通过这样的存储过程的结果:

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

但是,我希望能够将多个存储过程的结果传递给我的视图。如果我不使用存储过程,这可以通过视图模型来实现,但我很难找到一种通过存储过程来实现的方法。

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

干杯

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

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);
}

在这种情况下,有两种方法可以工作:
首先,你可以创建一个超级模型,并使每个存储的过程成为该模型的一个元素!像这样:
如何在单个Razor视图中编辑多个模型
或者您可以在视图中使用元组:
http://www.dotnetperls.com/tuple
http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx

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

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

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

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

您也可以使用LINQ手动完成。您可以使用投影函数Select将结果从其原始形式映射并整形为目标类,例如:

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