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 ,如需转载请自行联系原作者






相关文章
|
2月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
57 1
|
27天前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
69 0
|
2月前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
62 3
|
2月前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
103 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
51 7
|
4月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
157 2
|
4月前
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
95 1
|
4月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
82 0

热门文章

最新文章