ASP.NET MVC Framework体验(4):控制器

简介:

概述

在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技术联盟小组,欢迎大家加入: [url]http://space.cnblogs.com/group/webdev/[/url]















本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/67774 ,如需转载请自行联系原作者






相关文章
|
1天前
|
设计模式 存储 前端开发
MVC(模型-视图-控制器)是一种在Web应用程序开发中广泛使用的软件设计模式
【5月更文挑战第12天】MVC模式是Web应用开发中的常见设计模式,将逻辑、数据和界面分离,提升代码可维护性和重用性。模型处理数据逻辑,视图展示数据,控制器协调用户输入与模型视图交互。优点包括代码分离、易维护、可扩展和组件重用,促进高效灵活的开发。
7 2
|
18天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
22 0
|
1月前
|
前端开发 Java Spring
作用域大揭秘:探索Spring MVC控制器作用域的精髓
作用域大揭秘:探索Spring MVC控制器作用域的精髓
19 2
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0
|
2月前
|
前端开发 Java Spring
ssm中spring mvc找不到控制器,报错404
ssm中spring mvc找不到控制器,报错404
17 0
|
2月前
mvc.net分页查询案例——控制器(HomeController.cs)
mvc.net分页查询案例——控制器(HomeController.cs)
8 0
|
2月前
|
设计模式 前端开发 数据处理
MVC架构中,控制器和模型之间是如何交互的
MVC架构中,控制器和模型之间是如何交互的
13 0
|
2月前
|
存储 设计模式 前端开发
请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
【2月更文挑战第26天】【2月更文挑战第89篇】请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
115 5
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
47 0