第一篇:基于ASP.NET MVC2 创建第一个简单页面

前言

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 MVC400电话 电子公告之旅吧。在这一篇中,我们将做完所有的准备工作。

配置环境

如果您还没有安装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; }
}
}

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

ICategoryService.cs:

C#代码 复制代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Text;   
  5. using MVCDemo.Models.Entities;   
  6. namespace MVCDemo.Models.Interfaces   
  7. {   
  8. /// <summary>   
  9. /// 分类服务组件接口   
  10. /// </summary>   
  11. public interface ICategoryService   
  12. {   
  13. /// <summary>   
  14. /// 添加分类   
  15. /// </summary>   
  16. /// <param name="category"></param>   
  17. void Add(CategoryInfo category);   
  18.         /// <summary>   
  19. /// 修改分类名称   
  20. /// </summary>   
  21. /// <param name="id"></param>   
  22. /// <param name="name"></param>   
  23. void ChangeName(int id,string name);   
  24.         /// <summary>   
  25. /// 删除分类   
  26. /// </summary>   
  27. /// <param name="id"></param>   
  28. void Remove(int id);   
  29.         /// <summary>   
  30. /// 取得某个分类详细信息   
  31. /// </summary>   
  32. /// <param name="id"></param>   
  33. /// <returns></returns>   
  34. CategoryInfo GetDetail(int id);   
  35.         /// <summary>   
  36. /// 取得所有分类   
  37. /// </summary>   
  38. /// <returns></returns>   
  39. List<CategoryInfo> GetAll();   
  40. }   
  41. }  
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

C#代码 复制代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Text;   
  5. using MVCDemo.Models.Entities;   
  6. namespace MVCDemo.Models.Interfaces   
  7. {   
  8. /// <summary>   
  9. /// 公告服务组件接口   
  10. /// </summary>   
  11. public interface IAnnounceService   
  12. {   
  13. /// <summary>   
  14. /// 发布公告   
  15. /// </summary>   
  16. /// <param name="announce"></param>   
  17. void Release(AnnounceInfo announce);   
  18.         /// <summary>   
  19. /// 修改公告信息   
  20. /// </summary>   
  21. /// <param name="announce"></param>   
  22. void Notify(AnnounceInfo announce);   
  23.         /// <summary>   
  24. /// 删除公告 (http://www.my400800.cn)   
  25. /// </summary>   
  26. /// <param name="id"></param>   
  27. void Remove(int id);   
  28.         /// <summary>   
  29. /// 取得公告详细内容   
  30. /// </summary>   
  31. /// <param name="id"></param>   
  32. /// <returns></returns>   
  33. AnnounceInfo GetDetail(int id);   
  34.         /// <summary>   
  35. /// 取得某个分类下的所有公告   
  36. /// </summary>   
  37. /// <param name="categoryId"></param>   
  38. /// <returns></returns>   
  39. List<AnnounceInfo> GetByCategory(CategoryInfo category);   
  40. }   
  41. }  
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>
/// 删除公告 (http://www.my400800.cn)
/// </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:

C#代码 复制代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Web;   
  5. using MVCDemo.Models.Interfaces;   
  6. using MVCDemo.Models.Entities;   
  7. namespace MVCDemo.Models.MockModels   
  8. {   
  9. /// <summary>   
  10. /// “欺骗”服务组件,用于模拟分类的业务服务   
  11. /// </summary>   
  12. public class MockCategoryService : ICategoryService   
  13. {   
  14. /// <summary>   
  15. /// 添加分类   
  16. /// </summary>   
  17. /// <param name="category"></param>   
  18. public void Add(CategoryInfo category)   
  19. {   
  20. return;   
  21. }   
  22.         /// <summary>   
  23. /// 修改分类名称   
  24. /// </summary>   
  25. /// <param name="id"></param>   
  26. /// <param name="name"></param>   
  27. public void ChangeName(int id, string name)   
  28. {   
  29. return;   
  30. }   
  31.         /// <summary>   
  32. /// 删除分类   
  33. /// </summary>   
  34. /// <param name="id"></param>   
  35. public void Remove(int id)   
  36. {   
  37. return;   
  38. }   
  39.         /// <summary>   
  40. /// 取得某个分类详细信息   
  41. /// </summary>   
  42. /// <param name="id"></param>   
  43. /// <returns></returns>   
  44. public CategoryInfo GetDetail(int id)   
  45. {   
  46. return new CategoryInfo   
  47. {   
  48. ID = id,   
  49. Name = "最新通告",   
  50. };   
  51. }   
  52.         /// <summary>   
  53. /// 取得所有分类   
  54. /// </summary>   
  55. /// <returns></returns>   
  56. public List<CategoryInfo> GetAll()   
  57. {   
  58. List<CategoryInfo> categories = new List<CategoryInfo>();   
  59. for (int i = 1; i <= 5; i++)   
  60. {   
  61. CategoryInfo category = new CategoryInfo   
  62. {   
  63. ID = i,   
  64. Name="通告类别"+i,   
  65. };   
  66.                 categories.Add(category);   
  67. }   
  68.             return categories;   
  69. }   
  70. }   
  71. }  
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

C#代码 复制代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Web;   
  5. using MVCDemo.Models.Interfaces;   
  6. using MVCDemo.Models.Entities;   
  7. namespace MVCDemo.Models.MockModels   
  8. {   
  9. /// <summary>   
  10. /// “欺骗”服务组件,用于模拟公告的业务服务   
  11. /// </summary>   
  12. public class MockAnnounceService : IAnnounceService   
  13. {   
  14. /// <summary>   
  15. /// 发布公告   
  16. /// </summary>   
  17. /// <param name="announce"></param>   
  18. public void Release(AnnounceInfo announce)   
  19. {   
  20. return;   
  21. }   
  22.         /// <summary>   
  23. /// 修改公告信息   
  24. /// </summary>   
  25. /// <param name="announce"></param>   
  26. public void Notify(AnnounceInfo announce)   
  27. {   
  28. return;   
  29. }   
  30.         /// <summary>   
  31. /// 删除公告   
  32. /// </summary>   
  33. /// <param name="id"></param>   
  34. public void Remove(int id)   
  35. {   
  36. return;   
  37. }   
  38.         /// <summary>   
  39. /// 取得公告详细内容   
  40. /// </summary>   
  41. /// <param name="id"></param>   
  42. /// <returns></returns>   
  43. public AnnounceInfo GetDetail(int id)   
  44. {   
  45. return new AnnounceInfo   
  46. {   
  47. ID = id,   
  48. Title = "第" + id + "则公告",   
  49. Content = "全体同学明早九点集体做俯卧撑!",   
  50. };   
  51. }   
  52.         /// <summary>   
  53. /// 取得某个分类下的所有公告   
  54. /// </summary>   
  55. /// <param name="categoryId"></param>   
  56. /// <returns></returns>   
  57. public List<AnnounceInfo> GetByCategory(CategoryInfo category)   
  58. {   
  59. List<AnnounceInfo> announces = new List<AnnounceInfo>();   
  60. for (int i = 1; i <= 10; i++)   
  61. {   
  62. AnnounceInfo announce = new AnnounceInfo   
  63. {   
  64. ID = i,   
  65. Title = category.Name+ "的第" + i + "则公告",   
  66. Content = "全体同学明早九点集体做俯卧撑!",   
  67. };   
  68.                 announces.Add(announce);   
  69. }   
  70.             return announces;   
  71. }   
  72. }   
  73. }  
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)
{
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下的。


C#代码 复制代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Web;   
  5. using MVCDemo.Models.Interfaces;   
  6. using MVCDemo.Models.MockModels;   
  7.   
  8.   
  9. namespace MVCDemo.Models   
  10. {   
  11. /// <summary>   
  12. /// 服务组件生成类,用于生成业务服务组件   
  13. /// </summary>   
  14. public sealed class ServiceBuilder   
  15. {   
  16. /// <summary>   
  17. /// 创建分类服务组件   
  18. /// </summary>   
  19. /// <returns>分类服务组件</returns>   
  20. public static ICategoryService BuildCategoryService()   
  21. {   
  22. return new MockCategoryService();   
  23. }   
  24.   
  25.   
  26.         /// <summary>   
  27. /// 创建公告服务组件   
  28. /// </summary>   
  29. /// <returns>公告服务组件</returns>   
  30. public static IAnnounceService BuildAnnounceService()   
  31. {   
  32. return new MockAnnounceService();   
  33. }   
  34. }   
  35. }  
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 MVC2 创建第一个简单页面
 

小结

在这篇文章中,我们只是讲了一下这个系列文章要做什么,以及为案例做了一些准备工作。从下篇开始,我们将正式开始使用ASP.NET MVC完成这个案例。

你可能感兴趣的:(.net,公告,asp.net,asp,LINQ)