如何使用视图模型向单个视图提供动态数据集

本文关键字:视图 动态 数据集 何使用 模型 单个 | 更新日期: 2023-09-27 17:57:07

(第一次发帖,对MVC相当陌生) 我目前有一个 MVC/C# 应用程序,用户在其中选择一个 ID 列表,然后选择一个报告类型(8 个可能的不同报告调用 8 个不同的数据库视图)。 我将所有这些参数传递给控制器。 根据所选的报告类型,我想获取数据,将其发送回视图,然后以网格/表格格式显示数据。

我尝试通过ViewBag和ViewData发送数据,但在使用@foreach解析实际列/数据时遇到问题。这时我决定尝试ViewModels。

//My ViewModel....
//I know that I am missing the {get;set;} code which is where I also
// need help with.  I need to pass the selected ID's to each database view and 
// perform additional query requests (i.e. Distinct, Order By). 
// Sample query:
// var dd = (from p in _db.Report1 select new { sId = p.ReportID, UserName = p.Submitted_By, 
//      Balance = p.TotalDebt}).Distinct();
// dd = dd.Where(w => chosenUserIDs.Contains(w.sID));
// dd.OrderBy(p => p.sId).ThenBy(p => p.UserName).ThenBy(p => p.Balance);
public class UserReportsViewModel
{
    public List<namespace.report1> Report1 = new List<namespace.report1>();
    public List<namespace.report2> Report2 = new List<namespace.report2>();
    public List<namespace.report3> Report3 = new List<namespace.report3>();
    ...
}
//My Controller
UserReportsViewModel UserReportVM = new UserReportsViewModel();
switch (reportType)
{
    case "REPORT1":
        //Pass the selected ID's and get the data back from Report1 db view
        // not quite sure how to do this.
        break;
    case "REPORT2":
        break;
    case "REPORT3":
        break;
    default:
        break;
}
return View(UserReportsVM);

我甚至走在正确的轨道上吗? 我还遇到了一些关于部分视图和让视图调用/引用正确的部分视图(?较旧的语言要简单得多,但我真的很喜欢MVC/.Net/C#。

至于我的数据库,我使用的是 CodeFirst 实体框架。

如何使用视图模型向单个视图提供动态数据集

我强烈建议您为每个报告设置视图,视图模型和操作。只需根据客户端中请求的报告调用正确的终结点。

或者,如果要对一个终结点(操作)执行此操作,请指定要返回的视图。如果未指定视图名称,它将基于操作名称返回视图,但您可以指定要呈现的视图。

return View("ViewToRender", viewModel);

如果你想花哨,你可以用一个视图来做到这一点。在视图模型中包括一个布局对象和数据...这样,您就可以使用一个视图模型。布局将是"列信息字段"的列表。列 1 将具有此标题、此宽度等。它将绑定到 GenericReportViewModel.Column1。

从那里,您只需将数据投影到该通用视图模型中。

每个模型将返回具有唯一列集的唯一数据。上面用户的评论

如果是这种情况,请在视图中编写如下逻辑

@if(model.Report1!=null && model.Report1.Count!=0){
 // your logic for report1 goes here or you can also use partial view to render
 } 
else if(model.Report2!=null && model.Report2.Count!=0)
{ 
// your logic for report2 goes here or you can also use partial view to render
} 

所有其他报告相同。希望这会有所帮助

感谢大家的帮助和指导。我决定部分观点。 我的问题的解决方案如下。

对于每个报告,我都会获取数据并立即将数据存储到 ViewData 中。

IQueryable<dbViewName> Report8 = _db.dbViewName;
ViewData["qryResults"] = Report8;
...
return View(ViewData["qryResults"]);

然后在主视图中,我调用部分视图:

@Html.RenderPartial(rt, ViewData["qryResults"]);

在部分视图中,我的模型是强类型。

@model IQueryable<dbViewName>

这允许我使用以下方法列出表中的数据:

@foreach (var item in Model)

它干净且易于实现客户端将来可能要求的任何其他报告。

再次感谢大家的投入。