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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Free Spire.XLS for .NET 是e-iceblue公司开发的一款支持对所有Excel格式类型文件进行操作的.NET 控件。它适用于任何类型的应用程序比如ASP.NET Web应用程序或者Windows桌面应用程序。Spire.XLS for .NET允许开发人员创建和管理Excel,而不需要安装Microsoft Excel或者Microsoft Office。相比Microsoft,Spire.XLS for .NET对于开发人员来说是一个更好的选择 - 自动化,安全,稳定,可扩展性延伸,速度快,价格便宜和功能强大。 通过使用Free Spire.XLS for .NET,开发人员可以快速方便的查看,生成,读写以及自定义编辑Excel文件。Spire.XLS for .NET支持Excel 97-2003, Excel 2007, Excel 2010 and Excel 2013。它还支持C#, VB.NET, ASP.NETASP.NET MVC编程语言 作为一款专业,强大,方便易用的控件,Spire.XLS for .NET有一下主要功能: 新建Excel文件,编辑已有的Excel文件,多种保存Excel方式,设置Excel文件属性,文件打印设置,合并,拆分或者拷贝单元格,支持对Excel文件加锁或者加密保护。 Spire.XLS for .NET支持把数据从数据库导出到Excel工作表,或者把数据从Excel数据导入到数据库。 Spire.XLS for .NET 提供强大的功能为开发者设置单元格格式。这次格式化数字,文字缩进,定位调整,设置单元格边线,单元格填充以及保护等。 开发人员可以轻松的利用Spire.XLS for .NET向Excel文件里面写入内容,包括超过530多种的公式,70多种表格,支持插入图片,不同类型的文字,链接,注释甚至VBA等。 Spire.XLS for .NET 还允许开发人员将Excel文件转换成PDF, HTML, CSV, Text, XML以及图片格式。 注:下载包含有Spire.xls.dll文件以及部分Demo, 你可以调用DLL并参照Demo提供的代码处理Excel文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值