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

前言
     
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案例教程(基于ASP.NET MVC beta)——第一篇:准备工作的更多相关文章

  1. ASP.NET MVC案例教程(四)

    ASP.NET MVC案例教程(四) 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET MVC来呈现页面和数据了.但是,有一个大问题没有解决:如何处理表单数据.例如,我们将要实现的公告发布 ...

  2. ASP.NET MVC案例教程(五)

    ASP.NET MVC案例教程(四) 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET MVC来呈现页面和数据了.但是,有一个大问题没有解决:如何处理表单数据.例如,我们将要实现的公告发布 ...

  3. ASP.NET MVC案例教程(二)

    ASP.NET MVC案例教程(二) 让第一个页面跑起来 现在,我们来实现公告系统中的第一个页面——首页.它非常简单,只包括所有公告分类的列表,并且每个列表项是一个超链接.其中分类数据是用我们的Moc ...

  4. ASP.NET MVC案例教程(三)

    ASP.NET MVC案例教程(二) 让第一个页面跑起来 现在,我们来实现公告系统中的第一个页面——首页.它非常简单,只包括所有公告分类的列表,并且每个列表项是一个超链接.其中分类数据是用我们的Moc ...

  5. ASP.NET MVC案例教程(一) 准备

    ASP.NET MVC案例教程(一) 前言 ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了.可以说自动推出以来,一直广受关注.在经历了漫长的Preview之后,前几天终于推出了其 ...

  6. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

  7. ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程-约定 因为 ASP.NET Core 是可以跨平台的 ...

  8. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第五篇:MVC整合Ajax

    摘要      本文将从完成“输入数据验证”这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET MVC提供的同步方式完成数据验证.而后,将分别结合ASP. ...

  9. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据

    摘要      本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言      通过前几篇文章,我们已经能比较自如的使用ASP.NET ...

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

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

随机推荐

  1. c#(asp.net) 如何计算两个日期之间相隔天数

    1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("200 ...

  2. VirtualBox内刚刚安装完Debian9系统,也无法设置共享文件夹。解决的方法就是安装VirtualBox客户端增强包。

    VirtualBox内刚刚安装完Debian9系统,也无法设置共享文件夹.解决的方法就是安装VirtualBox客户端增强包. 1.若直接安装客户端增强包会得到如下提示:root@debian:/op ...

  3. 我在看着你呢——shiro学习

    说实话开学第一周效率并不高.项目该结的都差不多结了,看来这毛病我是养成了.项目忙的要死的时候,想休息想停一停就不断往下扔包袱.一下没项目了开学了,反倒开始手痒,捉摸着写点什么代码.马上我的小mac就要 ...

  4. Spring MVC 转发和重定向

    本文介绍Spring MVC中转发和重定向的区别. 转发和重定向 开始Java EE时,可能会对转发(forward)和重定向(redirect)这个两个概念不清楚.本文先通过代码实例和运行结果图片感 ...

  5. window 搭建python环境

    Unofficial Windows Binaries for Python Extension Packages 其中包含大量Windows下的python的module 包含大但不仅限于pip: ...

  6. HOJ——T 1867 经理的烦恼

    http://acm.hit.edu.cn/hoj/problem/view?id=1867 Source : HCPC 2005 Spring   Time limit : 2 sec   Memo ...

  7. cogs 1500. 误差曲线

    1500. 误差曲线 ★★   输入文件:errorcurves.in   输出文件:errorcurves.out   评测插件时间限制:1 s   内存限制:256 MB [题目描述] Josep ...

  8. Selenium_WebDriver操作iFrame日历框和复选框_Java

    iFrame日历框 页面上遇到iFrame元素时,先用findElement找到这个iFrame元素,然后再WebDriver.switchTo().frame(calFrame).在iFrame里操 ...

  9. OL记载Arcgis Server切片

    概述: 本文讲述怎样在OpenLayers中调用Arcgis Server切片并显示. 思路: 在OpenLayers中载入Arcgis Server切片用XYZ图层,Arcgis Server的切片 ...

  10. POJ 2457 BFS

    题意: 说人话: 从A到B连边 找从1到k的最短路 并输出路径(随便一条即可 ) 如果不能到达 输出-1 思路: 搜 //By SiriusRen #include <queue> #in ...