上一节给出了应用的两个主要UML类图,应用采用的技术也给出了,这一节开始实际设计编码

一.应用公开的方法

其实就几个的方法而已

1.代办事项的CRUD

2.代办事项归类目录的CRUD

3.代表事项“已完成”的更改。

二.MVC如何应用到系统中

引入MVC框架是为了更好的抽象应用程序各个模块,强制将应用程序分为三个大部分(Model-View-Controller),那么我们的应用在MVC框架下各个模块是怎么存放的呢?

Model: TodoCatalog、TodoEvent
View:

其实我们在一个页面(视图)就可以完成所有操作,这个页面应该展示事项列表,

并将我们的页面操作提交到Controller,接受结果再显示。

Controller: 控制器应该公开许多方法,再由页面请求调用并返回结果。

要说简单吧,其实也就3个类,一个HTML文件就可以搞定这事了。

三.初步了解ASP.Net MVC

3.1 路由系统

  ASP.Net MVC的路由系统相当强大,它使用一种约定成俗的命名规则来确定由哪个模块/方法提供服务,非常灵活。

其实MVC的路由系统使用IHttpHandler也可以做到类似的效果,但它做的事情不止这些,它还能帮助我们把HTTP请求的数据包装为实体对象,比如客户端使用表单提交了一个Json数据,只要Json的属性名跟我们定义的实体类对得上(不区分大小写),那么在请求处理方法的参数里我们可以直接这么写

/// <summary>
/// 保存代表事项
/// </summary>
public JsonResult SaveEvent(TodoEvent todoEvent)

注意跟IHttpHandler一样,MVC的路由处理配置也是可以配置的。

当你新建一个MVC项目时,默认的Global.asax文件(继承HttpApplication),在ApplicationStar的时候就调用了路由的配置代码RouteConfig.RegisterRoutes。

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "TodoList", action = "Index", id = UrlParameter.Optional }
);
}
}

如上,我让Default路由指向了Url为 “域名/TodoList/Index”,那么默认访问的第一个页面就是由TodoListController的Index方法给出的。

3.2 视图引擎Razor

MVC采用全新的杂交水稻方式开发视图界面,基于Razor的@语法,我们可以直接在编写HTML时直接访问C#的代码,非常灵活的解决了Model与View数据传输与展示的问题。

比如我们的TodlList列出所有代办事项时可以这么写,妈妈再也不用担心我加班了!

@
{
foreach (var catalog in catalogs)
{
<div class="div_catalog">
<!--归类名称-->
<div class="div_catalogName">@catalog.CatalogName</div>
<!--归类下所有代办事项-->
@foreach (TodoEvent todo in catalog.Events.Values)
{
<div class="div_todoevent">
@todo.Summary
</div>
}
</div>
}
}

其实简单说Razor就是把原先蹩脚的<% %> 用 @ 取代了,关于它的细节可以参考

Razor 语法

3.3 数据验证

有了Razor跟路由系统足够我们很快写出这个应用的后台了,为了方便编码,MVC还提供了其他的一些特性,比如数据验证。

在表单数据提交的时候,不管桌面软件还是Web应用,默认客户端都是不可信的,对于客户端提交的数据都会进行严格的验证。

然而数据验证的代码其实大部分千篇一律,为了消除这些重复劳动,MVC提供了几个Attribute给我们实体的属性作为验证,比如限制一个属性必须填写、一个属性必须在某个范围内,可以使用如下Attribute

[Required]     //必填字段
public string ProductName{ get; set;} [Range(0,1000)] //整型
或者
[Range(typeof(decimal),"0.00","49.99")] //decimal类型
public decimal Price{ get; set;}

详细的Attribute可以参考

MVC 数据验证

四.项目结构

了解了基本的MVC知识后我做出了如下的项目结构,非常简单

服务端主要就是一个Controller包含所有操作方法,一个Index的视图作为主界面,DataBase、DataContext和Entity是属于数据访问层的,因为项目比较小就没分出来了。

其实服务端工作量挺少的,就不贴代码了,下一节直接编写客户端。

TodoList开发笔记 – Part Ⅱ的更多相关文章

  1. TodoList开发笔记 – Part Ⅳ

    跌跌撞撞总算是把客户端开发好了,后台的代码因为不复杂,就写了些单元测试跑一跑就算通过了,大部分时间都是在调整脚本. 这一节开始部署TodoList项目. 一.了解IIS(Internet Infoma ...

  2. TodoList开发笔记 – PartⅠ

    做了一年多的桌面软件,最近开始转向Web方面的开发,既然比较熟悉Net那么首当其冲就是学习ASP.Net,以及HTML.CSS.Javascript. 为了检验这个把星期来的学习成果,着手做了一个To ...

  3. TodoList开发笔记 – Part Ⅲ

    本节开始对TodoList项目的客户端进行开发 一.初步了解JQuery 其实我在学校时有接触过一段时间的Web开发,虽然代码量不多也不复杂,但也已经感受到了各浏览器对Web各项标准的恶意,Web界对 ...

  4. [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】

    原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...

  5. EasyUI 开发笔记(二)

    接上篇 :EasyUI 开发笔记(一)  (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...

  6. EasyUI 开发笔记(一)

    由于某些原因,在公司做的后台需要改成类似于Ext.js 形式的后台,主要看好其中的 框架布局,以及tab开页面和弹出式内部窗体. 后来看看,改成EasyUI,较Ext.js 库小很多,也便于公司的初级 ...

  7. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  8. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  9. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

随机推荐

  1. R语言做文本挖掘 Part5情感分析

    Part5情感分析 这是本系列的最后一篇文章,该.事实上这种单一文本挖掘的每一个部分进行全部值获取水落石出细致的研究,0基础研究阶段.用R里面现成的算法,来实现自己的需求,当然还參考了众多网友的智慧结 ...

  2. 【智能家居篇】wifi网络访问原理(下一个)——联想Association

    转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 认证完毕后,下一步就是关联(Association). 工作站与基站进行关联.以便获得网络的全然訪问权. 关联属于一 ...

  3. android开源系列:CircleImageView采用圆形控制它们的定义

    1.定义自己的圆形控制github住址:https://github.com/hdodenhof/CircleImageView 基本的类: package de.hdodenhof.circleim ...

  4. C#精华(文章3版本)笔记

    C#精华(文章3版本) 跳转至: 导航. 搜索 文件夹 1 C#概述 2 数据类型 3 运算符和控制流 4 方法和參数 5 类 6 继承 7 接口 8 值类型(struct) 9 合式类型 10 异常 ...

  5. Activity的LaunchMode情景思考

    此链接:http://blog.csdn.net/xiaodongrush/article/details/28597855 1. 有哪几种类型?分别有什么用? http://developer.an ...

  6. sql server 汉字的长度

    前几天改了人家程序中的一个小bug,就是输入时长度的校验问题.项目是.Net的,数据库是 sql server的.检查了一下,发现以前的人员把长度给控制小了,数据库中允许输入256的长度,而别人在as ...

  7. mysql_【MySQL】常见的mysql 进程state

    Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ). checking permissions 线程是检查服务器是否具有所需的权限来执行该语句. Ch ...

  8. 使用ArcGIS API for Silverlight + Visifire绘制地图统计图

    原文:使用ArcGIS API for Silverlight + Visifire绘制地图统计图 最近把很久之前做的统计图又拿出来重新做了一遍,感觉很多时候不复习,不记录就真的忘了,时间是最好的稀释 ...

  9. pig 的chararry不能用于比较的类型可以comparison operator

    pig 的chararry类型可以是由场,通过现场实地比较. element_id 这是chararray种类. 声明: no_app_category_mapping = filter no_ele ...

  10. IOS数组排序等

    一.UITextField的代理方法 #pragma mark 当文本框开始编辑的时候调用---开始聚焦 - (void)textFieldDidBeginEditing:(UITextField * ...