概述

在MVC中,Controller用来处理和回应用户的交互,选择使用哪个View来进行显示,需要往视图中传递什么样的视图数据等。ASP.NET MVC Framework中提供了IController接口和Controller基类两种类型,其中在Controller提供了一些MVC中常用的处理,如定位正确的action并执行、为action方法参数赋值、处理执行过程中的错误、提供默认的WebFormViewFactory呈现页面。IController只是提供了一个控制器的接口,如果用户想自定义一个控制器的话,可以实现IController,它的定义如下:

public interface IController
{void Execute(ControllerContext controllerContext);
}

定义控制器和action

在前面三篇的例子中,我们已经定义过了控制器,只要继承于Controller就可以了:

public class BlogController : Controller
{[ControllerAction]public void Index(){BlogRepository repository = new BlogRepository();List<Post> posts = repository.GetAll();RenderView("Index", posts);}[ControllerAction]public void New(){
        RenderView("New");}
}
通过ControllerAction特性来指定一个方法为action,ControllerAction的定义非常简单:
[AttributeUsage(AttributeTargets.Method)]
public sealed class ControllerActionAttribute : Attribute
{public ControllerActionAttribute();
}

使用强类型传递ViewData

通过前面的一些示例,已经看到了一些示例如何从控制器传递视图数据给View,在Controller中,传递视图数据到View,我们可以有两种方式选择,其中一种是使用强类型来传递视图数据,如下示例代码:

[ControllerAction]
public void Index()
{BlogRepository repository = new BlogRepository();List<Post> posts = repository.GetAll();RenderView("Index", posts);
}

有朋友在回复中提到,如果想传递多个Model或者集合数据到View,该如何传递?这里需要再定义一个类型:

public class HomeViewData
{public List<Post> Posts{get; set;}public List<Category> Categories{get; set;}
}

然后在控制器中可以这样进行传递数据:

[ControllerAction]
public void Index()
{BlogRepository repository = new BlogRepository();List<Post> posts = repository.GetAll();List<Category> categories = repository.GetAllCategory();HomeViewData viewData = new HomeViewData();viewData.Posts = posts;viewData.Categories = categories;RenderView("Index", viewData);
}

使用强类型类来传递视图数据,有如下好处(来自于Scrottgu):

1.避免使用字符串来查询对象,得到对你的控制器和视图代码的编译时检查

2.避免需要在使用象C#这样的强类型语言中明确转换ViewData对象字典中的值

3.在你的视图网页的标识文件以及后台代码文件中得到你的ViewData对象的自动代码intellisense

4.可以使用代码重构工具来帮助自动化对整个应用和单元测试代码库的改动

使用ViewData字典来传递数据

在Controller基类中,有一个这样的字典定义:

public IDictionary<string, object> ViewData { get; }

这样我们可以直接把视图数据通过ViewData字段来传递,如下示例代码:

[ControllerAction]
public void Index()
{BlogRepository repository = new BlogRepository();List<Post> posts = repository.GetAll();List<Category> categories = repository.GetAllCategory();ViewData["posts"] = posts;ViewData["categories"] = categories;RenderView("Index");
}

在试图中,可以这样来获取视图数据:

<div><%foreach (Post post in (ViewData["posts"] as List<Post>)){ %>
    <div class="postitem"><strong>Title</strong>:<%=Html.Encode(post.Title) %></br><strong>Author</strong>:<%=Html.Encode(post.Author) %></br><strong>PubDate</strong>:<%=Html.Encode(post.PubDate.ToShortDateString()) %></br><strong>Content</strong>:<%=Html.Encode(post.Description) %></br><%=Html.ActionLink("Edit", new {action="Edit", Id=post.Id })%>
    </div><br /><% } %>
</div>

处理未知的Action

Controller类中包含了一个HandlerUnknownAction的方法:

protected internal virtual void HandleUnknownAction(string actionName);
它用来处理一些未知的Action,默认情况下将返回HTTP 404错误,如果想自定义该处理,可以覆写该方法:
[ControllerAction]
protected override void HandleUnknownAction(string actionName)
{if (ShouldShowSearch(action) == true){RedirectToAction("search", new { query = action });return;}base.HandleUnknownAction(actionName);
}

它用来处理当出现未知的Action时,跳转向Search Action。

结束语

在本篇文章中,我们介绍了ASP.NET MVC Framework中的Controller,包括如何定义Controller及Action,通过强类型和视图数据字典来传递视图数据,以及自定义处理未知的Action等内容,希望对您有所帮助。最后,插播一条小广告:我在博客园社区中建立了一个Web技术联盟小组,欢迎大家加入:http://space.cnblogs.com/group/webdev/

转载于:https://www.cnblogs.com/Terrylee/archive/2007/12/14/aspnet-mvc-framework-controller-overview.html

ASP.NET MVC Framework体验(4):控制器相关推荐

  1. ASP.NET MVC Framework体验(1):从一个简单实例开始

    概述 12月10日微软发布了ASP.NET 3.5扩展的预览版,在其中包括了ASP.NET MVC Framework.ASP.NET AJAX改进.ASP.NET动态数据支持.ASP.NET SIl ...

  2. ASP.NET MVC Framework体验(2):显示列表数据

    概述 ASP.NET WebForm下,显示列表数据,经常会使用服务器控件GridView.DataList等.在ASP.NET MVC Framework中,我们有两种方式进行显示数据,一是使用行内 ...

  3. ASP.NET MVC Framework 系列

    序言 做为设计模式的王者,MVC在众多领域都成为良好的模型的代名词,从前在ASP.NET下我们只能依靠Monorail来实现ASP.NET下无控件的MVC,但是现在ASP.NET 下的MVC已经成为现 ...

  4. 理解ASP.NET MVC Framework Action Filters(翻的)

    原文地址:Understanding Action Filters 本指南主要解释action filters,action filter作为一个可以应用到controller action(或者是整 ...

  5. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染...

    在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...

  6. ASP.NET MVC 音乐商店 - 2.控制器

    在典型的 Web 应用中,用户请求的 URL 地址通常映射到保存在网站中的文件上,例如,当用户请求 /Products.aspx 的时候,或者 /Products.php 的时候,很可能是在通过处理 ...

  7. 在Asp.net MVC framework中使用扩展方法创建Html Helper

    HtmlHelper提供了一些帮助的方法返回一个字符串来生成html. 在System.Web.Mvc.Html命称空间下有一些表单,控件,局部视图Helper方法.我将创建一个生成标签<inp ...

  8. ASP.NET MVC初体验

    本文首发于我的新浪博客http://blog.sina.com.cn/s/blog_4c59c08a0100es79.html CSDN博客也已发表. 两个星期前SMS短信平台项目就已经测试完毕,经历 ...

  9. Asp.net MVC中如何获取控制器的名称

    如果在代码中 当前controller.action的获取 RouteData.Route.GetRouteData(this.HttpContext).Values["controller ...

  10. Pro ASP.NET MVC 3 Framework 译文(一)

    ASP.NET MVC3简介 2011年10月22日 12:49 对于使用微软平台的开发人员来说,ASP.NET MVC框架有了一个根本的转变.它强调"干净的"体系.设计模式.可测 ...

最新文章

  1. R3Query 大数据分析系统2017将发布免费个人版
  2. ES6入门概览二--数组
  3. 【web安全】Spring Boot eureka xstream 反序列化
  4. Ubuntu下apt-get方式Git的安装、配置和更新
  5. maya怎么贴膜_maya怎么渲染成白膜?
  6. 博时基金基于 RocketMQ 的互联网开放平台 Matrix 架构实践
  7. Vue中组件间通信的方式
  8. shell读取mysql_shell读取mysql数据库
  9. volatile解析
  10. 计算库存产品成本---移动加权平均…
  11. 【程序源代码】投票小程序
  12. RTX3090ti和rtx2080ti参数对比
  13. linux 远程扫描仪,在ubuntu桌面配置一个网络打印机和扫描仪的方法
  14. 广告点击流量实时统计
  15. 图片压缩工具riottinypng
  16. 【放弃】notepad++ 云同步怎么玩?
  17. Markdown和快捷键
  18. 关于系统中的流水帐号
  19. 如何收取google adsense广告费?招行一卡通电汇设置指南
  20. 为什么黑客不黑/攻击赌博网站?如何入门黑客?

热门文章

  1. Struts2_day03--向值栈放数据
  2. linux下的备份管理rsync
  3. 李航教授展望自然语言对话领域:现状与未来
  4. logistics 与最大熵模型原理及python代码实现
  5. mysql的优化_第十一篇(查询计划篇)
  6. 百度富文本编辑器去掉自动保存功能
  7. 科大讯飞:5年内 科技会场没机器人端茶倒水就太low了
  8. 解析JDK 7的Garbage-First收集器
  9. C++ using关键字作用总结
  10. Python Regular Expression