MVC笔记 初识模型(二)

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

猜你喜欢

转载自blog.csdn.net/weixin_33836223/article/details/94606352