如何使用 ViewModel 将动态数据集提供给单个视图
How to supply dynamic data set to a single view using ViewModels
(第一次发帖,对 MVC 还很陌生)我目前有一个 MVC/C# 应用程序,用户可以在其中选择 ID 列表,然后选择报告类型(8 种可能的不同报告调用 8 种不同的数据库视图).我将所有这些参数传递给控制器。根据所选的报告类型,我想获取数据,将其发送回视图,然后以 grid/table 格式显示数据。
我尝试通过 ViewBag 和 ViewData 发送数据,但在使用 @foreach 解析实际 columns/data 时遇到了问题。这是我决定尝试 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);
我走在正确的轨道上吗?我还遇到了一些关于部分视图和视图 call/referrence 正确的部分视图(?)的事情。较早的语言实现这一点要简单得多,但我真的很喜欢 MVC/.Net/C#.
至于我的数据库,我使用的是 CodeFirst Entity framework。
Each model will return unique data with unique set of columns.
如果是这种情况,请在视图中编写这样的逻辑
@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
}
所有其他报告也一样。希望这会有所帮助
我强烈建议您为每个报告设置视图、视图模型和操作。只需根据客户端中请求的报告调用正确的端点即可。
或者,如果您想使用一个端点(操作)执行此操作,请指定您想要的视图 return。如果您不指定视图名称,它 return 是一个基于操作名称的视图,但您可以指定要呈现的视图。
return View("ViewToRender", viewModel);
如果你想花哨一点,你可以用一个视图来做。在视图模型中包含一个带有数据的布局对象......这样你就可以使用一个视图模型。布局将是 "column info fields" 的列表。 Column1 将具有 This header、this width 等。它将绑定到 GenericReportViewModel.Column1。
从那里开始,您只需将数据投影到该通用视图模型中。
感谢大家的帮助和指导。我决定局部视图。我的问题的解决方法如下
对于每个报告,我获取数据并立即将数据存储到 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)
实现客户将来可能要求的任何其他报告是干净且容易的。
再次感谢大家的参与。
(第一次发帖,对 MVC 还很陌生)我目前有一个 MVC/C# 应用程序,用户可以在其中选择 ID 列表,然后选择报告类型(8 种可能的不同报告调用 8 种不同的数据库视图).我将所有这些参数传递给控制器。根据所选的报告类型,我想获取数据,将其发送回视图,然后以 grid/table 格式显示数据。
我尝试通过 ViewBag 和 ViewData 发送数据,但在使用 @foreach 解析实际 columns/data 时遇到了问题。这是我决定尝试 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);
我走在正确的轨道上吗?我还遇到了一些关于部分视图和视图 call/referrence 正确的部分视图(?)的事情。较早的语言实现这一点要简单得多,但我真的很喜欢 MVC/.Net/C#.
至于我的数据库,我使用的是 CodeFirst Entity framework。
Each model will return unique data with unique set of columns.
如果是这种情况,请在视图中编写这样的逻辑
@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
}
所有其他报告也一样。希望这会有所帮助
我强烈建议您为每个报告设置视图、视图模型和操作。只需根据客户端中请求的报告调用正确的端点即可。
或者,如果您想使用一个端点(操作)执行此操作,请指定您想要的视图 return。如果您不指定视图名称,它 return 是一个基于操作名称的视图,但您可以指定要呈现的视图。
return View("ViewToRender", viewModel);
如果你想花哨一点,你可以用一个视图来做。在视图模型中包含一个带有数据的布局对象......这样你就可以使用一个视图模型。布局将是 "column info fields" 的列表。 Column1 将具有 This header、this width 等。它将绑定到 GenericReportViewModel.Column1。
从那里开始,您只需将数据投影到该通用视图模型中。
感谢大家的帮助和指导。我决定局部视图。我的问题的解决方法如下
对于每个报告,我获取数据并立即将数据存储到 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)
实现客户将来可能要求的任何其他报告是干净且容易的。
再次感谢大家的参与。