ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作
摘要
本文将简要介绍这个文章系列的目的、形式及大体内容。并且完成开始学习这个系列前所必要的准备工作。
前言
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)——第一篇:准备工作的更多相关文章
- ASP.NET MVC案例教程(四)
ASP.NET MVC案例教程(四) 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET MVC来呈现页面和数据了.但是,有一个大问题没有解决:如何处理表单数据.例如,我们将要实现的公告发布 ...
- ASP.NET MVC案例教程(五)
ASP.NET MVC案例教程(四) 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET MVC来呈现页面和数据了.但是,有一个大问题没有解决:如何处理表单数据.例如,我们将要实现的公告发布 ...
- ASP.NET MVC案例教程(二)
ASP.NET MVC案例教程(二) 让第一个页面跑起来 现在,我们来实现公告系统中的第一个页面——首页.它非常简单,只包括所有公告分类的列表,并且每个列表项是一个超链接.其中分类数据是用我们的Moc ...
- ASP.NET MVC案例教程(三)
ASP.NET MVC案例教程(二) 让第一个页面跑起来 现在,我们来实现公告系统中的第一个页面——首页.它非常简单,只包括所有公告分类的列表,并且每个列表项是一个超链接.其中分类数据是用我们的Moc ...
- ASP.NET MVC案例教程(一) 准备
ASP.NET MVC案例教程(一) 前言 ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了.可以说自动推出以来,一直广受关注.在经历了漫长的Preview之后,前几天终于推出了其 ...
- ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...
- ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程-约定 因为 ASP.NET Core 是可以跨平台的 ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第五篇:MVC整合Ajax
摘要 本文将从完成“输入数据验证”这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET MVC提供的同步方式完成数据验证.而后,将分别结合ASP. ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据
摘要 本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面
摘要 本文首先一步一步完成Demo的第一个页面——首页.然后根据实现过程,说明一下其中用到的与ASP.NET MVC相关的概念与原理. 让第一个页面跑起来 现在,我们来实现公告系统 ...
随机推荐
- 如何把本地的项目推送到github上面去
前题:本地已经建好了项目,但电脑上没有安装git (windows 系统) 1.首页从网上下载git 并安装. 2.进入项目所在的文件夹,右键鼠标 3.新建.gitignore文件 touch .g ...
- py2exe打包python脚本
在工作中遇到将python脚本转换成exe可执行程序的需求,通过查询可以使用py2exe来构建满足要求的程序,这里简要说明一下使用步骤. 一.py2exe是一个将python脚本转换成windows上 ...
- mysql省市区数据库表源码
下载 一:创建表 1省: create table CREATE TABLE `provinces` ( `id` ) NOT NULL AUTO_INCREMENT, `provinceid` ...
- 【Uva 1626】Brackets sequence
[Link]: [Description] 括号序列由这样的规则生成: 1.空字符是一个括号序列; 2.在括号序列两端加上一对括号也是括号序列; 如(s),[s]; 3.两个括号序列A和B,连在一起, ...
- 【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询
在我的上一篇博客<[java]itoo项目实战之hibernate 懒载入优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人非常受不了的事情.看着页面进度条一直转着圈圈, ...
- Linq复杂对象查询
复杂的查询对象, using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- Thinkphp的 is null 查询条件是什么,以及exp表达式如何使用
Thinkphp的 is null 查询条件是什么,以及exp表达式如何使用 一.总结 一句话总结:$map['name'] = array('exp','is null'); 1.is null判断 ...
- mvc4 视图中的form如何获取
public ActionResult Index(FormCollection form) { var Name = form["字段名" ...
- Regularized logistic regression
要解决的问题是,给出了具有2个特征的一堆训练数据集,从该数据的分布可以看出它们并不是非常线性可分的,因此很有必要用更高阶的特征来模拟.例如本程序中个就用到了特征值的6次方来求解. Data To be ...
- 记录一个mybatis编写xml遇到的错误:java.lang.unsupportedOperationException
写完xml里的sql在执行xml中的sql时报错,经过排查找到问题出在方法中的resultType这个属性的类型上 如图所示:只需要将sortedSet改为set集合里所存储的对象的类型即可. 这里我 ...