ASP.NET MVC控制器向视图传递数据
第1节:ViewBag的使用
基本概念
在ASP.NET MVC中,有一个特殊的ViewBag对象,ViewBag是一个dynamic动态类型,定义在ControllerBase类中,可以在此对象上定义任意的属性,且还可以在控制器和视图之间传递数据。ViewBag对象的定义如下图所示:
MVC ViewBag
图1
在图1中清楚的看到ViewBag是一个定义在ControllerBase类中的只读属性,其类型是dynamic。
ViewBag的用法是可以在此对象上定义任意名称的变量。基本格式如下:
ViewBag.变量名=值
如:ViewBag.Title=“小强”,ViewBag.Sum=200等。
控制器与视图通信
现在我们还没有学习到模型,模型是可以在视图和控制器之间传递数据的。ViewBag也可以在控制器和视图之间传递数据,它是一种最为简单的数据传递方式。
下面我们在控制器中使用ViewBag对象定义属性向视图传递数据。创建一个名称为YidoController的控制器,并在Index()方法中编写如下C#代码:
MVC ViewBag定义属性
图2
在图2的代码中,我们在ViewBag中定义了Name、Sum、Price这3个属性,并且都赋了值。
Index()方法的代码如下:
public ActionResult Index(){ViewBag.Name = "小强";ViewBag.Sum = 200;ViewBag.Price = 98.88;return View();}
从ViewBag上定义的属性类型可知,属性类型是任意的,没有限制,需要向视图传递什么数据,就定义什么类型的属性。
现在将定义的3个属性的值传递到视图中,只需要在视图中使用控制器返回的ViewBag对象即可。C#代码如图3所示:
ASP.NET MVC 视图
图3
在图3中,使用了@符号,在@符号后面可以使用C#代码,这样就可以在Html代码中使用C#代码获取数据,然后填充到Html标记中。
Index.cshtml核心代码如下:
- Name=@ViewBag.Name
- Sum=@ViewBag.Sum
- Price=@ViewBag.Price
运行一下图3的C#代码,结果如图4所示:
ASP.NET MVC 方法参数
图4
在图4中,我们已经看到在控制器中给ViewBag对象的属性所赋的值,现在已传递给视图了,这样我们就可以在控制器和视图之间传递一些简单的数据了。
如果我们在Controller中,给ViewBag对象的属性所赋的值是从SQL Server数据库中获取的,那么在视图中就可以展示从数据库中获取的数据了。
第2节:操作方法的参数
对于C#中的方法,是可以带有参数的,参数类型任意定义。而在ASP.NET MVC的控制器中是可以定义方法的,控制器本身就是一个类,只是继承了Controller基类而已。
那么控制器既然是类,就可以创建方法,只不过,控制器中的方法我们称为操作方法而已。
ASP.NET MVC控制器中带有参数的方法,这个参数用途与普通方法的参数是有区别的。控制器中操作方法的参数是从URL地址中传过来的。这样可以实现根据URL参数来有条件的从数据库中获取数据。
下面我们对操作方法的2种类型的参数进行详细讲解,这2种类型的参数是最为常用的,分别是文本参数和Id参数。文本参数就是字符串,URL地址本身就是一个字符串,因此,使用字符串参数更为合适,而Id参数是指数据库表中的主键字段,具有唯一性,可以用来快速的从数据库中获取行数据。
文本参数
对于ASP.NET MVC控制器中的操作方法,是可以使用文本参数的。如下C#代码,在Index()方法中传递一个string类型的name参数。
ASP.NET MVC 文本参数
图5
我们对上面的Index()方法代码进行了修改,将ViewBag.Name属性的值修改为参数name变量的值。
当在URL地址中输入name的值后,就会被Index()方法接收并将值赋值给ViewBag.Name属性,而Name属性的值又在Index视图中显示出来了。
现在运行一下图5的代码,查看一下结果,如图6所示:
ASP.NET MVC 获取参数值
图6
我们知道,在URL地址中,第一个参数是使用?分开的,从第二个参数以后就使用&将多个参数分开。所以在图6中,URL地址中使用了?name=大黄。name是参数变量,“大黄”是参数值。
Id参数
这里为什么要说一下id参数呢?因此id参数在Web应用程序中最为常见,基本上后台和前台系统都会使用到该id参数,用于获取数据库表中的行数据。
在ASP.NET MVC的路由配置中,就有id参数,如图7所示:
ASP.NET Id参数
图7
从路由配置上看,id是可选参数,可有可无。
如果URL上使用的是id参数,则可以使用/id的方法访问,注意:方法的参数名必须是id。如下Index()方法的代码:
ASP.NET MVC带有Id的参数
图8
并修改一下Index.cshtml视图中的代码,显示ViewBag.Id的值。访问时必须加上Index方法名,方法的参数名必须是id,但至于是什么数据类型,则就不无所谓了,可以是字符串,也可以是数字。运行一下图8的代码,结果如图9所示:
ASP.NET MVC获取id参数
图9
图9中访问id参数的方法与访问name参数的方法一样。但对于id参数来说,还有一种更酷的访问方式,如图10所示:
图10
在图10中,没有使用问号,而是使用了/,这样的URL地址更人性化,且容易记忆和使用。
至此,我们对控制器和视图之间的通信采用了ViewBag和操作方法的形式传递数据。等学习了模型之后,可以使用模型传递大量的数据,使用ViewBag和参数传递少量的数据。