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>
转载于:https://www.cnblogs.com/Eleanore/archive/2012/11/20/2778792.html