了解了什么是MVC之后,接下来用一个非常简单的留言板程序概要的了解MVC网站开发的过程,对MVC开发有个大致的轮廓。第一个项目将不会提到过多与数据库相关的技术,因此将以Framework Code First开发技术进行数据访问,核心在于体验MVC开发的过程。

2.1利用ASP.NET MVC4项目模板创建项目

开启Visual Studio2012,选择“文件”→“项目”的菜单命令

在打开的“新建项目”对话框中展开web→“ASP.NET MVC4 Web 应用程序”,修改一下名称为“MvcGuestbook” 如图所示:

点击确定后,会先弹出项目模板选择,询问你要使用哪个项目模板。选择“Internet应用程序”,其他默认即可,最后单击确定按钮,如图所示:

这个MVC项目就完全建好了,接下来“调试”→“启动调试”(或者按下F5)命令执行运行网站。

此网站具有非常基本的功能,包括简单的页面与会员机制,这些页面都套用主版页面(Layout Page),使用ASP.NET内建的Membership功能,可以进行会员注册、登陆、注销等。如图所示:

ASP.NETMVC4 项目模板再内建的会员机制,在网页第一次运行该会员机制相关的页面后,会在网站的APP_Date目录下自动创建默认的数据库文档(*.mdf、*.ldf),其文件命名规则会是“asp.net-项目名称-日期时间.mdf”。

项目创建完成后,会自动创建几个标准的目录结构与重要文档,如图所示:

MVC项目概要说明:

  

文件夹或文件 

描述 

/App_Data

放置私有数据:XML文件、SQLite 、SQL Server数据库文件、或其它基本文件的存储(数据)库

IIS 不对此文件夹进行内容服务(Web无法请求到)

/App_Start

包含项目核心的配置设置:路由、过滤器及其它内容包(脚本样式捆绑包等)

/bin

存放MVC应用程序编译好的程序集,不在GAC(全局程序集缓存)中的引用程序集

IIS 不对此文件夹进行内容服务(Web无法请求到)。在项目中“显示所有文件”才能看到。编译生成的二进制文件,通常不应该把它们放在源控制中

/Content

放置静态内容:CSS文件、图像等

约定,不是必须。

/Controllers

放置控制器类

约定,控制器类是可以放在任何地方,或是在一个独立的项目中定义模型类

/Models

放置视图模型或域模型类(简单项目)。

约定,一般用一个专用的项目定义域模型,此文件夹只放视图模型。

/Scripts

 存放JS库,JQuery和几个流行库  约定,可更改
/Views  保存视图分部视图,通常按关联的控制器进行命名文件夹  /Views/Web.config阻止IIS对此目录内容进行服务,必须通过Action方法进行渲染
/Views/Shared  保存布局、分享的视图(非专用的)  
/Views/Web.config  不是应用程序配置文件。含有全视图能够与ASP.NET进行工作、防止IIS调用视图所需要的配置,默认导入视图的命名空间  
/Global.asax  全局ASP.NET应用程序类。后台代码类(Global.asax.cs)用于注册路由配置、建立涉及程序初始化、停机、出现未知异常情况时运行的代码。  同web Form中的Global.asax作用
/Web.config  应用程序配置文件。  同web Form中的Web.config作用

2.2MVC中的约定

1.建议用户的约定:Scripts文件夹等

 2.“约定优于配置”:不需要明确地配置控制器与其视图之间的关联,只要遵从命名约定就能正常工作,如:

    (1)控制器类约定,必须以“Controller”结尾,类别继承于Controller基类,必须包含数个回传值为ActionResult的公开方法(动作Action);

    (2)视图约定,视图及分部视图放在/Views/<控制器名>文件夹中(忽略结尾Controller);

    (3)布局约定,以下划线(_)字符做为文件名前缀,且放在/Views/SHared文件夹中。除Empty项目模板外,VS会创建一个名为_Layout.cshtml的布局。默认情况下,会通过/Views/_ViewStart.cshtml文件将这个布局运用于所有视图。

2.3创建数据模型(Model)

在解决方案资源管理器中选择Model目录,单击鼠标右键,在弹出的快捷菜单中选择“添加”→“类”命令,如图所示:

其代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcGuestbook.Models
{
public class Guestbook
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Content { get; set; }
} }


之后生成一次解决方案,并确保没有任何问题。

2.4创建控制器、动作与视图

在解决方案资源管理器窗口选择Controller目录,单击鼠标右键,在弹出的快捷菜单中选择“添加”→“控制器”命令,并命名为“GuestbookController”

在基架选项区还有4个选项可以设置,在这里我们在模板下选择“包含读/写操作和视图的MVC控制器(使用Entity Framework)”选项,而在模型类中则选择我们新增的Guestbook模型类别

在“添加控制器”对话框的“基架选项”中还有个“数据上下文类”选项,由于我们尚未创建“数据上下文类”,但我们可以借此通过这个新增项目帮我们自动创建,因此可以选择“<新建数据上下文...>”选项,选择之后默认的名称,最后单击“添加按钮”完成控制器的添加,如图所示:

GuestbookController自动创建的代码:

 namespace MvcGuestbook.Controllers
{
public class GuestbookController : Controller
{
private MvcGuestbookContext db = new MvcGuestbookContext(); //
// GET: /Guestbook/ public ActionResult Index()
{
return View(db.Guestbooks.ToList());
} //
// GET: /Guestbook/Details/5 public ActionResult Details(int id = )
{
Guestbook guestbook = db.Guestbooks.Find(id);
if (guestbook == null)
{
return HttpNotFound();
}
return View(guestbook);
} //
// GET: /Guestbook/Create public ActionResult Create()
{
return View();
} //
// POST: /Guestbook/Create [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Guestbook guestbook)
{
if (ModelState.IsValid)
{
db.Guestbooks.Add(guestbook);
db.SaveChanges();
return RedirectToAction("Index");
} return View(guestbook);
} //
// GET: /Guestbook/Edit/5 public ActionResult Edit(int id = )
{
Guestbook guestbook = db.Guestbooks.Find(id);
if (guestbook == null)
{
return HttpNotFound();
}
return View(guestbook);
} //
// POST: /Guestbook/Edit/5 [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Guestbook guestbook)
{
if (ModelState.IsValid)
{
db.Entry(guestbook).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(guestbook);
} //
// GET: /Guestbook/Delete/5 public ActionResult Delete(int id = )
{
Guestbook guestbook = db.Guestbooks.Find(id);
if (guestbook == null)
{
return HttpNotFound();
}
return View(guestbook);
} //
// POST: /Guestbook/Delete/5 [HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Guestbook guestbook = db.Guestbooks.Find(id);
db.Guestbooks.Remove(guestbook);
db.SaveChanges();
return RedirectToAction("Index");
} protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}

此时,在Controllers目录新增了一个GuestbookController.cs。此外,由于我们在添加的时候选择了“包含读/写操作和视图的MVC控制器(使用Entity Framework)”模板,所以除了新增控制器外它连同所有的视图页面也全部一次创建完成。而在添加控制器的过程中新增了一个数据上下文类(DateContextClass),因此Model目录下多了一个MvcGuestbookContext.cs类文档,如图所示:

最后,这个项目已经完成,进行测试网页:

直接运行网站,启动调试,打开网页输入http://localhost:28039/Guestbook,按Enter键进入该页面。

如图所示,可以进行简单的增删改查:

至此,第一个MVC体验网站终于完整完成了,这个留言板还有许多要改进的地方。由于技术水平有限,可能不完全正确,仅供参考。

ASP.NET MVC 小牛之旅2:体验第一个MVC程序的更多相关文章

  1. ASP.NET MVC 小牛之旅3:Routing——网址路由

    网址路由(Routing)在ASP.NET MVC中有两个主要用途,一个用途是匹配通过浏览器传来的HTTP请求,另一个用途则是响应适当的网址给浏览器. 3.1匹配通过浏览器传来的HTTP请求 首先我们 ...

  2. ASP.NET + MVC5 入门完整教程三 (上) ---第一个MVC项目

    https://blog.csdn.net/qq_21419015/article/details/80420815 第一个MVC应用程序 1创建MVC项目 打开VS ,File--新建--项目,选择 ...

  3. ASP.NET MVC 小牛之旅4:ASP.NET MVC的运行生命周期

    ASP.NET MVC的运行生命周期大致分成三大过程:(1)网址路由对比. (2)运行Controller与Action. (3)运行View并回传结果. 4.1网址路由对比 当iis收到http请求 ...

  4. ASP.NET MVC 小牛之旅1:何谓MVC

    在学习ASP.NET MVC之前首先了解什么 是MVC ? MVC不是一种语言,严格来说也不算一个技术,而是开发时所使用的一种架构(框架),它就像是一种开发观念,或是一个设计样式. MVC让软件开发的 ...

  5. [转]NHibernate之旅(2):第一个NHibernate程序

    本节内容 开始使用NHibernate 1.获取NHibernate 2.建立数据库表 3.创建C#类库项目 4.设计Domain 4-1.设计持久化类 4-2.编写映射文件 5.数据访问层 5-1. ...

  6. 开始体验第一个JAVA程序吧!

    一.准备工作(配置环境) 1.安装JAVA开发工具(JDK) a.下载符合自己电脑系统的Java开发软件:http://www.oracle.com/technetwork/java/javase/d ...

  7. dotnet core开发体验之开始MVC

    开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...

  8. [ASP.NET MVC 小牛之路]17 - 捆绑(Bundle)

    本文介绍 MVC 4 提供的一个新特性:捆绑(Bundle),一个在  View 和 Layout 中用于组织优化浏览器请求的 CSS 和 JavaScript 文件的技术. 本文目录 了解VS默认加 ...

  9. [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject

    本人博客已转移至:http://www.exblr.com/liam  为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离( ...

随机推荐

  1. Memcached 分布式缓存实现原理简介

    摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...

  2. 问题杂烩(scrollTop/背景透明度动画)

    今天给同学找我帮忙写js,是公司里的活..我是不是应该跟他要钱哈哈,不过一顿饭肯定是免不了的了. 言归正传,今天写了三个小东西,因为兼容性的问题,用jq写的(很是别扭的说,但是没办法啊,一边看api一 ...

  3. 原生js监听input值改变事件

    哈哈哈,又来了,今天闲来无事,实验了下原生js监听input value值改变事件,下面就来说道说道: 本来写监听input值便获是用jquery的,之前的随笔写了,就是这个方法,地址:http:// ...

  4. 【python2/3坑】从gensim的Word2Vec.load()的中文vector模型输出时显示unicode码

    服务器上python2.7 打印出的e[0]对应的是 unicode码 于是分别尝试了用e[0].encode('utf-8')转码 和 e[0].decode('unicode-escape')依然 ...

  5. sql根据坐标算距离

    CREATE FUNCTION ConvertXYToDistance(@la1 DECIMAL,@lo1 DECIMAL,@la2 DECIMAL,@lo2 DECIMAL)RETURNS FLOA ...

  6. ACM学习历程—HDU5585 Numbers(数论 || 大数)(BestCoder Round #64 (div.2) 1001)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5585 题目大意就是求大数是否能被2,3,5整除. 我直接上了Java大数,不过可以对末尾来判断2和5, ...

  7. [转]HTTP头的Expires与Cache-control

    1.概念 Cache-control用于控制HTTP缓存(在HTTP/1.0中可能部分没实现,仅仅实现了Pragma: no-cache) 数据包中的格式: Cache-Control: cache- ...

  8. BZOJ1217:[HNOI2003]消防局的设立

    我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  9. 不卸载ceph重新获取一个干净的集群环境

    不卸载ceph重新获取一个干净的集群环境 标签(空格分隔): ceph ceph环境搭建 运维 部署了一个ceph集群环境,由于种种原因需要回到最开始完全clean的状态,而又不想卸载ceph客户端或 ...

  10. ASP.NET MVC 3:缓存功能的设计问题

    今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考. 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例 ...