周末狂欢两天,这周工作任务又好多,几天没有学习。。。
一、控制器和动作:
从前面的内容我们可以看到控制器的动作基本有两个特点:(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)添加视图:
logs_code_hide('378702a3-46e4-4c04-ab1f-db3a1165431f',event)" src="/Upload/Images/2014111402/2B1B950FA3DF188F.gif" alt="" />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=名称]
不知道是网络还是博客园出了问题,丢失了部分内容,剩下的重新整理单独再发一篇吧。。。