1.在视图中创建窗口,新建一个View视图。添加视图,选中复选框"创建强类型视图"。
需要输入的地方可以用MVC内置的HTML辅助方法来生成字段;需要显示标题的地方可以用 <%=Html.Label("")%>方法,需要显示文本的地方可以使用 <%=Html.TextBox("")%>方法。
在MVC中,可以利用Html.BeginForm()辅助方法实现自动输出窗口标识,语法如下:
1 <% using(Html.BeginForm("Save","Guestbook",FormMethod.Post)){ %>
2 窗口内容
3 <%} %>
或省略第三个参数,因为窗口默认的FormMethod就是"Post",如果 窗口送出的对象是同一个Action,那么也可以将语法简化如下:
1 <% using(Html.BeginForm()){ %>
2 窗口内容
3 <%} %>
因为送出窗口的对象与当前视图所在的Controller相同,只是Action不同,所以你可以运用一下技巧,通过View的RouteDate.Values对象取得当前的所有路由值,并动态加载路由值中的Controller的名称,示例如下:
1 <% using(Html.BeginForm("Save",RouteData.Values["controller"].ToString())){ %>
2 窗口内容
3 <%} %>
NOTE: MVC的路由值中包含许多与路由有关的信息,而这些路由的名称在MVC2中只有3个是内置的,分别为controller、action和area。其中,area路由值只有在链接到区域网站时才会有实际值,其他路由值的名称都可以由开发人员自定义(例如id)。自定义的路由值名称都会在Global.asax.cs文件的RegisterRoutes()方法中定义。
2. 通过Action接收窗口数据
TIP: 要想从视图转回控制器,可以在视图页面的空白处右击鼠标,再在弹出的快捷菜单中选择"转到控制器"即可。返回Guestbook控制器之后,可以利用vs2010的"插入代码段"功能新建一个动作,该功能只支持HTTP POST请求,如图:
完成之后的代码如下:
1 [HttpPost]
2 public ActionResult Save(string name,string Email,string content)
3 {
4 ViewData["name"] = name;
5 ViewData["Email"] = Email;
6 ViewData["content"] = content;
7 return View();
8 }
从Save()方法所输入的参数来看,此Save()方法输入了3个参数,其参数名称与在Index视图中所使用的窗口字段名称一模一样。为什么通过QueryString()方法或Form()方法传递过来的数据会变成Save()方法的参数呢?因为在MVC中有一个Model Binder(数据模型绑定)机制,通过这个机制可以自动将客户端传过来的数据转换成.NET类型数据,也因为这样,才能直接通过Save()方法的参数取得相关数据。
NOTE: 窗口字段名称是指中的name属性。
在Save()方法之前应用了一个 [HttpPost]属性,用于告知MVC此动作只会接受 Http Post请求送过来的数据。这个属性有自己的专有名称,叫做动作过滤器(Action Filter)或 动作选择器(Action Selector)。
启动调试,在浏览器中输入http://localhost:1309/Guestbook,并在留言板中输入信息,发现提交查询后,信息都保存在了save中。确认窗口能够通过Action来接收之后,再将数据写入数据库。前面已经将Entity Framwork创建了一个数据模型,下面可以用该模型来讲数据希尔数据库。Save动作编写完成后的程序代码如下:
1 [HttpPost]
2 public ActionResult Save(string name,string Email,string content)
3 {
4 MvcApplication1.Models.GuestbookEntities db = new Models.GuestbookEntities();
5
6 db.AddTo 留言板(new Models.留言板()
7 {
8 name =name,
9 Email=Email,
10 content=content,
11 dtime=DateTime.Now
12
13 });
14
15 db.SaveChanges();
16 ViewData["name"] = name;
17 ViewData["Email"] = Email;
18 ViewData["content"] = content;
19
20 return View();
21 }
我们要在Guestbook/Index中完成"显示所有留言"的功能,修改Guestbook中的Index()方法代码如下:
1 public ActionResult Index()
2 {
3 MvcApplication1.Models.GuestbookEntities db = new Models.GuestbookEntities();
4 var data = db.留言板;
5 return View(data);//输入View()的第一个参数就是要给View使用的Model数据
6 }
NOTE : 输入Model的数据不能为string类,否则会被当成视图名称来处理。
TIP: 如果你的项目从来没有生成过,在你的"视图数据类型"下拉表中找不到你要的数据类型。如果你的Entity Framework或LINQ to SQL模型已经更新,也千万要进行生成(Build)操作后在执行"加入视图"动作,这样才能在"视图数据类型"下拉列表中看到你需要的数据类型。
为了方便操作,我们新添加一个留言板视图。新建操作完成后,稍微调整一下页面,完成后代码如下。
1 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication1.Models.LogOnModel>>" %>
2
3 <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
4 显示留言
5 </asp:Content>
6 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
7 <h2>显示留言</h2>
8 <table>
9 <tr>
10 <th></th>
11 <th>
12 姓名
13 </th>
14 <th>
15 Email
16 </th>
17 <th>
18 内容
19 </th>
20 <th>
21 建立时间
22 </th>
23 </tr>
24
25 <% foreach (var item in Model) { %>
26
27 <tr>
28 <td>
29 <%: item.UserName %>
30 </td>
31 <td>
32 <%: item.Email %>
33 </td>
34 <td>
35 <%=Html.Encode(item.Content).Replace("\r\n","<br/>\r\n") %>
36 </td>
37 <td>
38 <%:String.Format("{0:g}",item.time) %>
39 </td>
40 </tr>
41
42 <% } %>
43 </table>
44 <p>
45 <%: Html.ActionLink("留下足迹", "Write") %>
46 </p>
47 </asp:Content>