首页 > 代码库 > 《ASP.NET MVC 4 实战》学习笔记 4:控制器(上)

《ASP.NET MVC 4 实战》学习笔记 4:控制器(上)

周末狂欢两天,这周工作任务又好多,几天没有学习。。。

一、控制器和动作:

从前面的内容我们可以看到控制器的动作基本有两个特点:(1)public修饰;(2)返回ActionResult。

但动作并非必须返回ActionResult,可以是void的或其他,如下面两例:

 1 public class SimpleController:Controller 2 { 3      public void Index() 4     { 5         Response.Write("<h1>Hello World !</h1>"); 6     }     7 } 8 ////////////////////////////////////////////////////////////// 9 public class SimpleController:Controller10 {11      public string Index()12     {13         return "<h1>Hello World !</h1>";14     }    15 }

需要注意的是ControllerActionInvoker(控制器动作调用器)总是将动作的返回值封装成一个ActionResult。

另外,我们可以用NoActionAttribute对public方法进行修饰,以阻止控制器上的public方法成为动作:

1 public calss SimpleController:Controller2 {3     [NoAction]4     public string SomePublicMethod()5     {6         return "Hello Wordl !";7     }8 }

二、控制器的任务:

控制器有两个通用任务:手工映射视图模型和接受用户输入(执行验证)。

1.手动映射视图模型:

视图模型是为了在屏幕上显示数据而单独创建的模型对象。随着应用程序复杂性的提升,往往要求视图数据与模型结构不同。例如Guestbook应用程序的一个页面中显示每个用户的评论次数:

1)添加一个视图模型:

1 namespace Guestbook.Models2 {3     public class CommentSummary4     {5         public string UserName { get; set; }6         public int NumberOfComments { get; set; }7     }8 }

2)控制器添加动作:

 1 public ActionResult CommentSumary() 2         { 3             var entries = from entry in db.Entries 4                           group entry by entry.Name 5                               into groupByName 6                               orderby groupByName.Count() descending 7                               select new CommentSummary 8                               { 9                                   NumberOfComments=groupByName.Count(),10                                   UserName=groupByName.Key11                               };12             return View(entries.ToList());13         }

3)添加视图:

 1 @model IEnumerable<Guestbook.Models.CommentSummary> 2  3 @{ 4     ViewBag.Title = "CommentSumary"; 5 } 6  7 <h2>CommentSumary</h2> 8  9 <p>10     @Html.ActionLink("Create New", "Create")11 </p>12 <table class="table">13     <tr>14         <th>15             @Html.DisplayNameFor(model => model.UserName)16         </th>17         <th>18             @Html.DisplayNameFor(model => model.NumberOfComments)19         </th>20         <th></th>21     </tr>22 23 @foreach (var item in Model) {24     <tr>25         <td>26             @Html.DisplayFor(modelItem => item.UserName)27         </td>28         <td>29             @Html.DisplayFor(modelItem => item.NumberOfComments)30         </td>31     </tr>32 }33 34 </table>
View Code

2.输入验证:

前面GuestbookController的Create动作中接受用户输入没有做任何验证,下面加以改进:

1)添加验证注解属性--修改GuestbookEntry: 

 

 1 namespace Guestbook.Models 2 { 3     public class GuestbookEntry 4     { 5         public int Id { get; set; } 6         [Required] 7         public string Name { get; set; } 8         [Required] 9         public string Message { get; set; }10         public DateTime DateAdded { get; set; }11     }12 }

 

2)检查验证是否成功--修改create动作:

 1         [HttpPost] 2         [ValidateAntiForgeryToken] 3         public ActionResult Create([Bind(Include="Id,Name,Message,DateAdded")] GuestbookEntry guestbookentry) 4         { 5             if (ModelState.IsValid)//检查验证是否成功 6             { 7                 db.Entries.Add(guestbookentry); 8                 db.SaveChanges(); 9                 return RedirectToAction("Index");10             }11 12             return View(guestbookentry);//失败时重新渲染表单13         }

3)在视图中显示错误消息:

@Html.ValidationSummary(true)

注:若要在视图中显示自定义消息,只要修改Required注解属性的声明,如:

        [Required(ErrorMessage="请输入您的用户名")]        public string Name { get; set; }    

如果不想对消息进行硬编码,可以指定源文件的名称和类型:

[Required(ErrorMessageResourceType=typeof(类型),        ErrorMessageResourceName=名称]

不知道是网络还是博客园出了问题,丢失了部分内容,剩下的重新整理单独再发一篇吧。。。

《ASP.NET MVC 4 实战》学习笔记 4:控制器(上)