MVC神韵---你想在哪解脱!(六)
将控制器中的数据传递给视图
在我们使用数据库并介绍模型之前,首先我们介绍一下如何将控制器中的信息传递给视图。浏览器接收到一个URL请求后,将会调用控制器类来进行响应。你可以在控制器类中进行对接收到的页面参数进行处理的代码,你可以在控制器类中书写从数据库中获取数据的代码,你也可以在控制器类中书写代码来决定返回给客户端什么格式的响应文件。控制器可以利用视图模板文件来生成HTML格式的响应文件并显示在浏览器中。
控制器类负责提供视图模板文件在生成HTML格式的响应文件时所需要的任何数据或对象。一个视图模板文件不应该执行任何业务逻辑,也不应该直接和数据库进行交互。它只能和控制器类进行交互,获取控制器类所提供给它的数据,这样可以使你的代码更加清晰,容易维护。
现在在我们的应用程序中,HelloWorldController控制器类中的Welcome方法带有两个参数—name与Times,Welcome方法直接向浏览器输出这两个参数的参数值。这里,我们修改该方法使其不再直接输出数据,而是使用一个视图模板。该视图模板将生成一个动态的响应流,这意味着我们需要将数据从控制器类传递给视图以便利用该数据来生成该响应流。我们在该控制器类中将视图模板所需要的数据送入一个ViewBag对象中,该对象可以被视图模板直接接收。
打开HelloWorldController.cs文件,修改Welcome方法,在该方法中为ViewBag对象添加一个Message属性与NumTimes属性,并且将属性值分别设定为经过处理后的name参数值与numTimes参数值。ViewBag对象是一个动态对象,你可以为它添加任何属性并赋上属性值。在未赋值之前该属性是不生效的,直到你赋值为止。修改后的HelloWorldController.cs文件中的代码如代码清单:
using System.Web;
using System.Web.Mvc;
namespace MvcMovie.Controllers
{ public class HelloWorldController : Controller
{ public ActionResult Index()
{ return View(); }
// GET: /HelloWorld/Welcome/
public ActionResult Welcome(string name, int Times = 1)
{ ViewBag.Message = "Hello " + name;
ViewBag.Times = Times;
return View();
}
}
}
注:有人问为什么我的编译器是清一色的@View.Title,而不是@ViewBag.Title。所以频频报错?这是因为你没有用MVC 4版而是3版。ViewBag是4版新增的动态类型!下一个MVC 4 OK!
现在ViewBag对象中已经包含了数据,它将被自动传递给视图。 接下来,我们需要创建一个Welcome视图模板。在“调试”菜单中,点击“生成 XXX”将应用程序进行编译.接下来,在Welcome方法中点击鼠标右键,然后点击“添加视图”,
在该对话框中不做任何修改,直接点击添加按钮,View文件夹下的HelloWorld文件夹中自动被创建了一个Welcome.cshtml文件,打开该文件,在<h2>元素下添加代码,让浏览器显示URL地址中传入的name参数中设定的文字,显示次数等于URL地址中传入的Times参数中设定的次数。修改后的Welcome.cshtml文件中的代码如代码所示:
@{ ViewBag.Title = "Welcome";}
<h2>Welcome</h2>
<ul>
@for (int i = 0; i < ViewBag.Times; i++)
{ <li>@ViewBag.Message</li> }
</ul>
运行应用程序,并且在地址栏中输入“http://localhost:xx/HelloWorld/Welcome?name= Scott×=4”,该地址栏中的页面参数将会自动传递给控制器。控制器将会把这些参数值放入ViewBag对象中并且传递给视图。视图再在浏览器中显示这些数据。这里,我们没有使用数据库,只是通过控制器直接设置数据传给视图模板。在下一节中,我们将创建一个数据库,并且介绍如何对该数据库中的数据进行处理。我们要用模型,所以请先预先下模型部分。