摘要
      本文将简要介绍这个文章系列的目的、形式及大体内容。并且完成开始学习这个系列前所必要的准备工作。

前言
      ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了。可以说自动推出以来,一直广受关注。在经历了漫长的Preview之后,前几天终于推出了其beta版。并且在官方文档中,微软声明最终的正式版与beta版相比不会有大的变化。所以,对于.NET平台的开发人员来说,是时候学习ASP.NET MVC了。
      本系列文章作为一个ASP.NET MVC的入门教程,将不会长篇大论介绍其中的概念及理论。而是通过案例实践来学习ASP.NET MVC。在这系列文章中我将逐步完成一个“公告发布系统”。我的写作策略是:先动手做,遇到需要解释概念和理论的时候再解释,而不是先把概念和理论解释完再做东西。
      另外,我还有几点要说明的:
      1.为了将大家的关注点充分集中在ASP.NET MVC上,这个Demo的业务处理将使用Mock的方式。即不会真正去访问数据库,而是虚拟一些数据。
      2.本Demo将不考虑任何美工问题。
      下面,让我们一起开始ASP.NET MVC之旅吧。在这一篇中,我们将做完所有的准备工作。

配置环境
      如果您还没有安装ASP.NET MVC的话,请到这里下载安装。
      下载后,按提示安装就可以了。

新建项目
      安装完ASP.NET MVC后,在VS里新建一个项目,可以看到有一个“ASP.NET MVC Web Application”的选项,选择它,新建一个项目,并命名为“MVCDemo”。
      建完项目后,可以看到默认情况下已经建立了很多文件夹,这里简略说一下各个文件夹的作用。
      Content——存放应用需要的一些资源文件,如图片、CSS等。
      Controllers——存放控制器类。
      Models——存放业务模型组件。
      Scripts——存放JavaScript脚本文件。
      Views——存放视图。
      现在不了解一些概念没关系,后续文章将慢慢解释。

准备工作
      新建完项目后,我们要做的准备工作就是建立Mock业务模型,这样以后我们就直接使用这些“欺骗”式的业务模型进行业务处理,而将全部关注点放在ASP.NET MVC的学习上。
      首先在Models下新建三个文件夹,分别叫做Entities、Interfaces、MockModels,分别用来存放实体类、接口及Mock业务模型。
      Entities下有两个类:CategoryInfo和AnnounceInfo,分别是公告类别和公告的实体类。具体代码如下:
CategoryInfo.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCDemo.Models.Entities
{
    /// <summary>
    /// 分类实体类
    /// </summary>
    public class CategoryInfo
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

AnnounceInfo.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCDemo.Models.Entities
{
    /// <summary>
    /// 公告实体类
    /// </summary>
    public class AnnounceInfo
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public int Category { get; set; }
    }
}

接下来,我们将定义两个接口,分别是公告类别服务和公告服务必须实现的接口。这两个接口放在Interfaces下。
ICategoryService.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MVCDemo.Models.Entities;

namespace MVCDemo.Models.Interfaces
{
    /// <summary>
    /// 分类服务组件接口
    /// </summary>
    public interface ICategoryService
    {
        /// <summary>
        /// 添加分类
        /// </summary>
        /// <param name="category"></param>
        void Add(CategoryInfo category);

/// <summary>
        /// 修改分类名称
        /// </summary>
        /// <param name="id"></param>
        /// <param name="name"></param>
        void ChangeName(int id,string name);

/// <summary>
        /// 删除分类
        /// </summary>
        /// <param name="id"></param>
        void Remove(int id);

/// <summary>
        /// 取得某个分类详细信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        CategoryInfo GetDetail(int id);

/// <summary>
        /// 取得所有分类
        /// </summary>
        /// <returns></returns>
        List<CategoryInfo> GetAll();
    }
}

IAnnounceService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MVCDemo.Models.Entities;

namespace MVCDemo.Models.Interfaces
{
    /// <summary>
    /// 公告服务组件接口
    /// </summary>
    public interface IAnnounceService
    {
        /// <summary>
        /// 发布公告
        /// </summary>
        /// <param name="announce"></param>
        void Release(AnnounceInfo announce);

/// <summary>
        /// 修改公告信息
        /// </summary>
        /// <param name="announce"></param>
        void Notify(AnnounceInfo announce);

/// <summary>
        /// 删除公告
        /// </summary>
        /// <param name="id"></param>
        void Remove(int id);

/// <summary>
        /// 取得公告详细内容
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        AnnounceInfo GetDetail(int id);

/// <summary>
        /// 取得某个分类下的所有公告
        /// </summary>
        /// <param name="categoryId"></param>
        /// <returns></returns>
        List<AnnounceInfo> GetByCategory(CategoryInfo category);
    }
}

然后,我们在MockModels下建立两个Mock业务逻辑服务模型。注意它们要各自实现自己的接口。
MockCategoryService.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MVCDemo.Models.Interfaces;
using MVCDemo.Models.Entities;

namespace MVCDemo.Models.MockModels
{
    /// <summary>
    /// “欺骗”服务组件,用于模拟分类的业务服务
    /// </summary>
    public class MockCategoryService : ICategoryService
    {
        /// <summary>
        /// 添加分类
        /// </summary>
        /// <param name="category"></param>
        public void Add(CategoryInfo category)
        {
            return;
        }

/// <summary>
        /// 修改分类名称
        /// </summary>
        /// <param name="id"></param>
        /// <param name="name"></param>
        public void ChangeName(int id, string name)
        {
            return;
        }

/// <summary>
        /// 删除分类
        /// </summary>
        /// <param name="id"></param>
        public void Remove(int id)
        {
            return;
        }

/// <summary>
        /// 取得某个分类详细信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public CategoryInfo GetDetail(int id)
        {
            return new CategoryInfo
            {
                ID = id,
                Name = "最新通告",
            };
        }

/// <summary>
        /// 取得所有分类
        /// </summary>
        /// <returns></returns>
        public List<CategoryInfo> GetAll()
        {
            List<CategoryInfo> categories = new List<CategoryInfo>();
            for (int i = 1; i <= 5; i++)
            {
                CategoryInfo category = new CategoryInfo
                {
                    ID = i,
                    Name="通告类别"+i,
                };

categories.Add(category);
            }

return categories;
        }
    }
}

MockAnnounceService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MVCDemo.Models.Interfaces;
using MVCDemo.Models.Entities;

namespace MVCDemo.Models.MockModels
{
    /// <summary>
    /// “欺骗”服务组件,用于模拟公告的业务服务
    /// </summary>
    public class MockAnnounceService : IAnnounceService
    {
        /// <summary>
        /// 发布公告
        /// </summary>
        /// <param name="announce"></param>
        public void Release(AnnounceInfo announce)
        {
            throw new Exception("发布公告失败了!原因?没有原因!我是业务组件,我说失败就失败!");
            return;
        }

/// <summary>
        /// 修改公告信息
        /// </summary>
        /// <param name="announce"></param>
        public void Notify(AnnounceInfo announce)
        {
            return;
        }

/// <summary>
        /// 删除公告
        /// </summary>
        /// <param name="id"></param>
        public void Remove(int id)
        {
            return;
        }

/// <summary>
        /// 取得公告详细内容
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public AnnounceInfo GetDetail(int id)
        {
            return new AnnounceInfo
            {
                ID = id,
                Title = "第" + id + "则公告",
                Content = "全体同学明早九点集体做俯卧撑!",
            };
        }

/// <summary>
        /// 取得某个分类下的所有公告
        /// </summary>
        /// <param name="categoryId"></param>
        /// <returns></returns>
        public List<AnnounceInfo> GetByCategory(CategoryInfo category)
        {
            List<AnnounceInfo> announces = new List<AnnounceInfo>();
            for (int i = 1; i <= 10; i++)
            {
                AnnounceInfo announce = new AnnounceInfo
                {
                    ID = i,
                    Title = category.Name+ "的第" + i + "则公告",
                    Content = "全体同学明早九点集体做俯卧撑!",
                };

announces.Add(announce);
            }

return announces;
        }
    }
}

可以看到,这两个类并没有访问数据库,也没有实现真正的业务逻辑,而不过是“捏造”了一些数据骗骗我们的表示层而已。
      最后,我们要建立一个生成业务逻辑模型的生成器,用来实现表示层和业务逻辑层的解耦。当然,为了简化复杂度,这里没有使用依赖注入机制。下面是我们生成器的代码,这个类是直接放在Models下的。
ServiceBuilder.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MVCDemo.Models.Interfaces;
using MVCDemo.Models.MockModels;

namespace MVCDemo.Models
{
    /// <summary>
    /// 服务组件生成类,用于生成业务服务组件
    /// </summary>
    public sealed class ServiceBuilder
    {
        /// <summary>
        /// 创建分类服务组件
        /// </summary>
        /// <returns>分类服务组件</returns>
        public static ICategoryService BuildCategoryService()
        {
            return new MockCategoryService();
        }

/// <summary>
        /// 创建公告服务组件
        /// </summary>
        /// <returns>公告服务组件</returns>
        public static IAnnounceService BuildAnnounceService()
        {
            return new MockAnnounceService();
        }
    }
}

OK,到这里,我们的准备工作就做完了。完成这些后,系统的目录结构如下图所示:

小结
      在这篇文章中,我们只是讲了一下这个系列文章要做什么,以及为案例做了一些准备工作。从下篇开始,我们将正式开始使用ASP.NET MVC完成这个案例。
from: http://www.cnblogs.com/leoo2sk/archive/2008/10/27/1320285.html

ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作相关推荐

  1. T2噬菌体MVC案例教程

    T2噬菌体MVC案例教程 http://www.cnblogs.com/leoo2sk/archive/2008/10/27/1320285.html MVC初学者浅显易懂的教程 转载于:https: ...

  2. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面

    摘要       本文首先一步一步完成Demo的第一个页面--首页.然后根据实现过程,说明一下其中用到的与ASP.NET MVC相关的概念与原理. 让第一个页面跑起来       现在,我们来实现公告 ...

  3. JavaScript组件之JQuery(A~Z)教程(基于Asp.net运行环境)[示例代码下载](一)

    (一).概述 现在有好多比较优秀的客户端脚本语言组件, 如: Prototype.YUI.jQuery.mootools.Bindows, Scriptaculous, FCKEditor 等, 都非 ...

  4. Windows网络编程案例教程-董相志 学习记录 第一个网络程序hostent

    <Windows网络编程案例教程>-董相志 学习记录 第一个网络程序hostent 第一章 网络编程概述 1.3.5第一个网络程序--hostent 对主机的名称和地址解析 WinSock ...

  5. 第六篇:拦截器( MVC案例教程(基于ASP.NET MVC beta))

    http://ljl-xyf.javaeye.com/blog/725196 摘要       本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论A ...

  6. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇

    摘要       本文对ASP.NET MVC的全局运行机理进行一个简要的介绍,以使得朋友们更好的理解后续文章. 前言       在上一篇文章中,我们实现了第一个ASP.NET MVC页面.对于没有 ...

  7. ASP.NET MVC案例教程——拦截器 Filter

    摘要       本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题       我们继续完善 ...

  8. ASP.NET程序设计案例教程《上机操作题》

    目录 需求 详细步骤: 完成创建效果图 查看布局效果 布局代码 修改后的效果 运行测试 效果展示 源代码下载地址 需求 创建一个ASP.NET空网站,在其中新建一个网页,显示单击"提交&qu ...

  9. 软件项目管理案例教程第4版课后习题第一章

    第一章 一.填空题 二.判断题 三.选择题 四.问答题 一.填空题 1.敏捷模型包括(4)个核心价值,对应(12)个敏捷原则. 详解: 敏捷开发4句宣言: 个体与交互 胜过 过程与工具 可以工作的软件 ...

最新文章

  1. SharePoint 2010 自定义日志
  2. 微服务领域,为什么选SpringCloud而不是Dubbo?
  3. 实用目标检测器 | 性能超YoloV5,推理耗时不变(附github源码)
  4. JS获取系统时间--JavaScript基础
  5. 处理WCF异常的方式
  6. Linux 系统 vsftpd时区问题的解决
  7. Python-OpenCV基本操作cv2
  8. 【linux】Shell脚本中调用另外一个脚本的方法
  9. linux超级工具,linux运维超级工具--sysdig
  10. 公开最近开发的OA的框架图
  11. bzoj 4447 小凸解密码
  12. C11标准库原子操作/无锁队列 stdatomic.h
  13. RubyOnRails with Ajax
  14. 一篇文章搞定支付宝网页支付!
  15. 头条极速版-艳云脚本云控系统
  16. QT QDataEdit
  17. 帆软报表更新到服务器控件展示不出来_报表工具软件FineReport常见问题与解答总结...
  18. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一2.9 疏密相间构图法
  19. 给孩子们的美术史(1)-艺术的起源
  20. Software Version 1976

热门文章

  1. 跟我学大数据分析:多维度数据分析报告
  2. 谷歌发布TensorFlow 1.4与TensorFlow Lattice:利用先验知识提升模型准确度 搜狐科技 10-12 15:29 选自:Google Research Blog 参与:李泽南、
  3. 深度学习:让电脑像人一样看世界
  4. 解读思科2014-19年全球移动互联网发展趋势报告(1)
  5. Quartz-JobListener解读
  6. Spring Cache抽象-缓存注解
  7. 2021-06-04
  8. tensorflow只用CPU运行
  9. 2021-03-01 Matlab 多项式的根求解
  10. php回调函数如何执行顺序,PHP回调函数调用方式