带有 viewbag 的 MVC 数据集

Posted

技术标签:

【中文标题】带有 viewbag 的 MVC 数据集【英文标题】:MVC datasets with viewbags 【发布时间】:2012-04-07 03:31:56 【问题描述】:

如何将数据集放入 viewbag 并在视图中显示结果?

我有一个来自模型的数据集,我将其写入视图包。我想使用 foreach 循环将数据行从视图中的视图包中取出。

我已经有一个变量进入视图,所以我无法正常传递数据集。每页我还将有许多其他数据集。所以我认为 viewbag 是解决这个问题的最佳方法。

型号

class modeldata 

    public dataset readrows(DataSet dataset)
    
    //returns data from sql query.
    

控制器:

 DataSet data = new DataSet();
 modeldata getdata = new modeldata ();
 ViewBag.Data = getdata.readrows(data);
 return view("page1") //based on case statement. 
 //Already have a value going into view, so I need to use viewbag

查看:

@Model site.controllers.homecontroller;

     foreach (Model.data row in ViewBag.Data.Rows)
        
            @:row["id"] + " " + row["name"];
         

【问题讨论】:

为什么在 MVC 应用程序中使用数据集?如果您处理数据模型和 ORM,事情会变得更好。 带有 100 条 SQL 语句的旧代码。没有时间为这个项目转换。 那么,真正的问题是什么? 问题是:如何将数据集放入视图包并在视图中显示行。我上面有一个 foreach 示例。 foreach 示例是否有效?如果没有,什么不起作用?假设 Model.data 类型与 ViewBag.Data.Rows 中的项目相同,您提供的代码看起来应该可以工作。我认为可能需要DataRow,但我已经有一段时间没有搞砸数据集了。 【参考方案1】:

要在视图中显示数据,您有两种选择。一种是将 Model 类的实例传递给强类型视图。第二个选项是使用 ViewBag。在您的情况下,您似乎正在同时做一些事情,但我建议使用强类型视图方法。

视图将具有一个Model 属性,该属性表示您的@Model 声明指定的类类型的一个实例。在您的代码中,您正在使用无法工作的控制器类。我重写了示例以使用DataSet 作为模型。如您所见,View 的Model 属性成为System.Data.DataSet 类的一个实例,并具有其所有属性和方法。

查看

@Model System.Data.DataSet;

foreach (DataRow row in Model.Rows)

    @:row["id"] + " " + row["name"];
 

控制器

DataSet data = new DataSet();
modeldata getdata = new modeldata();
return View(getdata.readrows(data));

编辑:

这是一个使用模型类中的 Dictionary 来存储多个 DataSet 的示例。然后,您可以修改视图以使用模型数据类型作为其模型类。

型号

namespace Site.Models

    class modeldata
    
        public Dictionary<string, DataSet> DataSets  get; set; 

        public static DataSet ReadRows(DataSet dataset)
        
            //returns data from sql query.
        
    

查看

@Model Site.Models.modeldata;

@foreach (System.Data.DataTable table in Model.DataSets["sampleData"].Tables)

    foreach (System.Data.DataRow row in table.Rows)
    
        @:row["id"] + " " + row["name"];
    
 

控制器

DataSet data = new DataSet();
modeldata getdata = new modeldata();
getdata.DataSets["sampleData"] = modeldata.ReadRows(data);
return View(getdata);

【讨论】:

我有其他内容进入视图,我计划每页有多个数据集,所以我无法返回它。有没有其他方法可以从视图中到达它? @user719825:只需创建一个 ViewModel 类,其中包含您要发送到视图的“其他内容”数据集。这样一个对象就可以满足这两种需求。 嗯,这确实是一个有趣的方法。你能给我举个例子吗? 我编辑了我的答案以显示这一点。您可以在 modeldata 类中创建属性来存储您需要的其他数据。 抱歉耽搁了。我仍在努力。我认为这个例子的唯一问题是 .Rows 在 foreachloop 中仍然不存在,因为“DataSets”是一个属性。有什么我想念的吗?【参考方案2】:

您需要创建一个模型类来包含每个数据集作为属性,例如:

public class MyModel 

    DataSet data1,
    DataSet data2,
    DataSet data3

然后返回绑定到类型“MyModel”的强类型视图,然后在视图中允许您执行以下操作:

var myDataInTheView = model.data1;

然后,您可以像其他人描述的那样使用 foreach 方法,但要使用模型的属性,而不是模型类本身。在上面的sn-p中,循环myDataInTheView

【讨论】:

以上是关于带有 viewbag 的 MVC 数据集的主要内容,如果未能解决你的问题,请参考以下文章

在使用MVC5 添加视图后 添加的视图中 关键字ViewBag model 等报错。

Angular.Js 性能、大型数据集、ng-repeat、带有过滤器和双向绑定的 html 表

MVC中利用ViewBag传递Json数据时的前端处理方法

使用 c# 在 mvc4 中使用 viewbag 数据的下拉列表

asp.net mvc中使用linq to sql查询数据集(IQueryable类型) 怎么用foreach循环去数据集的数据?

MVC4 之 ViewData ViewBag TempData