【问题标题】:Passing the results from multiple stored procedures to a view将结果从多个存储过程传递到视图
【发布时间】:2014-09-01 11:03:50
【问题描述】:

.net 处女在这里,所以请原谅我的任何令人眼花缭乱的错误。

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

通过我的控制器,我可以像这样传递存储过程的结果:

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

但是,我希望能够将多个存储过程的结果传递给我的视图。如果我不使用存储过程,这可以使用视图模型来完成,但我正在努力寻找一种方法来使用我的存储过程。

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

干杯

【问题讨论】:

  • 你用的是什么ORM?
  • 所有存储过程的结果集是否都具有相同的“形状”?
  • 第二行应该是return View(vehiModels.ToList());吗?
  • 这里不是 MVC 专业人士,所以我可能错了。不同的存储过程是否返回不同类型的数据?如果他们这样做了,那么可以在一个新的单一模型类中收集这些数据。否则,您可以合并存储过程返回的结果。
  • @AndreySarafanov 应该,是的。已编辑。干杯

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


【解决方案1】:

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

【讨论】:

  • 谢谢。你能详细说明一下吗?例如,我想将国家/地区列表(也从存储过程中检索)与车辆列表一起传递到页面。我需要为国家和车辆创建一个基本模型吗?在 VehicleViewModel 中,我会有另一个国家/地区的集合?
  • 是的,您可以添加另一个属性来保存国家/地区。
【解决方案2】:

在这种情况下有两种方法可以工作:
首先,您可以创建一个超级模型并将每个存储过程转换为该模型的一个元素! 像这样:
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

【讨论】:

    【解决方案3】:

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

    也就是说,您需要为您的案例创建一个合适的 ViewModel。问题是您稍后需要输入该模型(即设置属性值)。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多