《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:Controller
10 {
11      public string Index()
12     {
13         return "<h1>Hello World !</h1>";
14     }    
15 }

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

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

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

二、控制器的任务:

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

1.手动映射视图模型:

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

1)添加一个视图模型:

1 namespace Guestbook.Models
2 {
3     public class CommentSummary
4     {
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.Key
11                               };
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=名称]

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。