MVC架构学习
作为一名小小的GreenBird,学习MVC呢,已经花费了2天了,期间得到了美丽的学姐的帮助,初步整理了一下。
首先,学习MVC呢就先以一个标准的MVC的简单的例子来入手,然后根据学姐的PPT,我用vs2012建立了一个项目。
1.建立一个MVC架构的项目:
File->New Project->Visual C#->ASP.NET MVC 4 Web Application
可以直接运行这个网站
2.Adding a Controller
右键单击Controller->add->Controller(CommentControler)
public string Index()
{
return "This is my first test of <b>MVC</b>...";
}
把原来的Index方法可以注释掉。
3.在RouteConfig.cs里面有路由规则。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
可以试验一下这个路由规则:
在新建的CommentControler里新定义一个action如下:
public string Welcome(string name, int numTimes = 1)
{
return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}
然后在浏览器上面
也可以改变一下路由规则:
routes.MapRoute(
name: "Cathy",
url: "{controller}/{action}/{name}/{id}"
);
改变一下Comment里面的action:
public string Welcome(string name, int ID = 1)
{
return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}
4.Add a folder View|Comment
引用:Layout = "~/Views/Shared/_Layout.cshtml";(可以在Share里面的要引用的东西直接拖过来稍微修改一下就可以了)
Index里面的内容是这个样子的:
@{
ViewBag.Title = "Easy";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Practice of *Comments</h2>
5.修改CommentController里面的内容,
public ActionResult Index()
{
return View();
}
把此注释去掉。
6.在Share的公共模板里面修改界面的格式,menu里面增加一个超链接的文字。
(可以输入函数名称,把鼠标放在上面看下面的参数应该怎么写)
<li>@Html.ActionLink("Easy", "Index", "Comment")</li>
7.Adding a Model:Comment.cs
using System;
using System.Data.Entity;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Practice.Models
{
public class Comment
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int CommentID { get; set; }
public DateTime CommentTime { get; set; }
public string CommnetUser { get; set; }
public string CommenContent { get; set; }
public int ParentCommentID { get; set; }
}
}
8.在Models 里面的另外的cs文件中寻找Dbcontext,并写入:
public DbSet<Comment> Comments { get; set; }
9.在菜单栏里面找到tools->libraries package manager->package manager console
分别输入下面的命令:
Enable-Migrations//会在工程里面自动生成一个Migrations文件
Add-Migration Create_DB_DIY(自己定义的,但是没有间隔)
Update-Database
这样就在vs里面创建了一个数据库,里面有两张表,可以在View->Server Explore里面找到tables,有两张表:
可以右击表,New Query,新建查询
10.设计Easy超链接的页面Index.cshtml
<div>
<div>
<table>
<tr>
<td>
<div>
<div style="color: blue">CommnetUser</div>
<div>CommenContent</div>
<div style="color: gray; font-size: 10px;">CommentTime</div>
</div>
</td>
<td>
<div>
<input id="delete-button" type="submit" value="Delete" />
</div>
</td>
</tr>
</table>
</div>
<div>
<div>
<input name="commentUser" type="text" placeholder="User Name..." />
</div>
<div>
<textarea name="commentContent" rows="5"></textarea>
</div>
<div>
<input id="submit-button" type="submit" value="Submit" />
</div>
</div>
</div>
到了这个地方,我们就可以得到显示的页面了,但是这个时候还不能与数据库连接,需要新建Controller来控制与数据库的交互。
11.新建Controller:BaseController.cs增加内容:
public UsersContext db = new UsersContext();
另外为了和数据库进行交互,还需包含下面的using System.Web.Mvc;
using MVC4.Models;
12.修改CommentController.cs
using CommentSample.Models;
Change Controller into BaseController
public ActionResult Index()
{
var comments = db.Comments.OrderByDescending(c => c.CommentTime).ToList();
return View(comments);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CommentFunction(string commentUser, string commentContent)
{
if (commentUser != null && commentContent != null)
{
db.Comments.Add(new Comment { CommentTime = DateTime.Now, CommnetUser = commentUser, CommenContent = commentContent, ParentCommentID = 0 });
db.SaveChanges();
}
return RedirectToAction("Index", "Comment");
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteFunction(int commentId)
{
var comment = db.Comments.SingleOrDefault(c => c.CommentID == commentId);
if (comment != null)
{
db.Comments.Remove(comment);
db.SaveChanges();
}
return RedirectToAction("Index", "Comment");
}
}
13.修改Comment/Index.cshtml:
@model List<MVC4.Models.Comment>
@using MVC4.Models
@{
ViewBag.Title = "Easy";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div>
<div>
<table>
@foreach (var comment in Model.Where(c => c.ParentCommentID == 0))
{
<tr>
<td>
<div>
<div style="color: blue">@comment.CommnetUser</div>
<div>@comment.CommenContent</div>
<div style="color: gray; font-size: 10px;">@comment.CommentTime</div>
</div>
</td>
<td>
@using (Html.BeginForm("DeleteFunction", "Comment", "FormMethod.Post"))
{
@Html.AntiForgeryToken()
@Html.Hidden("commentId",comment.CommentID)
<div>
<input id="delete-button" type="submit" value="Delete" />
</div>
}
</td>
</tr>
}
</table>
</div>
@using (Html.BeginForm("CommentFunction", "Comment", FormMethod.Post))
{
@Html.AntiForgeryToken()//防止CSRS攻击
<div>
<div>
<input name="commentUser" type="text" placeholder="User Name..." />
</div>
<div>
<textarea name="commentContent" rows="5"></textarea>
</div>
<div>
<input id="submit-button" type="submit" value="Submit" />
</div>
</div>
}
</div>
这样的话就建立了一个简单的留言簿。可以输入评论人的名字,评论内容,提交后显示在页面上,页面上的每个评论都可以删除。
期间出现了问题:
The resource cannot be found.
下面的网址提供了解决方案:
http://cephas.net/blog/2005/07/14/aspnet-the-resource-cannot-be-found/
但是这个对于我来说好像并没有什么用处,Fiona学姐给我解决了这个问题,就是我没有把CSRS攻防的方法放在正确的位置上。
每个增删数据的方法对应于Controller.cs里面的一个方法,该方法上面要加上相应的防止CSRS攻防的语句。同时,在View里利用@来定义一个Action里所对应的模型,这样就可以直接在cshtml文件中调用“Model”变量。 Model其实是一个类库,封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,它可以直接访问数据库。对于一个事件,Controller首先会根据这个事件作出相应的处理,去改变View或Model。
下面是引用的一个博客的文章的一段:
原文地址:(http://blog.csdn.net/qinkeliangqin/article/details/27084639)
MVC网站的访问流程:
1. 当第一个请求从客户端发起的时候,首先执行的是Global.asax中的Application_Start()方法来完成一些初始化工作,其中重要的一步是RegisterRoutes方法,这个方法指定了如何将url映射到具体的方法上,稍后详解。
2. 根据第一步中指定的映射表生成一个RouteData对象,利用这个对象来创建一个RequestContext对象。
3. MvcRouteHandler创建一个MvcHandler,并将RequestContext对象传给MvcHandler。
4. MvcHandler对象利用RequestContext对象确定一个IControllerFactory对象来创建Controller对象。
5. MvcHandler对象调用Controller对象的Execute()方法。
6. Controller的ControolerActionInvoker对象决定调用controller的哪个具体的action方法。
7. Action方法接受用户参数,执行方法,返回一个Result类型的对象。
注:其实还有很多问题没有搞清楚,以后接触的过程中会继续学习~~
参考文献:
http://www.cnblogs.com/zgqys1980/archive/2012/08/17/2643572.html
http://blog.csdn.net/qinkeliangqin/article/details/27084639
MVC架构学习的更多相关文章
- MVC架构学习之Smarty学习——病来而蔫
前两天是五一小长假,而每次假期都想着如何如何刻苦一番,往往是自作多情.. 当然这次是有小病在身,多个借口吧. 一有病就蔫的不行...要锻炼了啊,脚估计也差不多了,游泳试试吧这周. 这次学习Smarty ...
- MVC架构学习之EasyFirst——快点夸我爱学习~
iMooc上的MVC教程练习. MVC是PHP基础和进阶的分界点吧应该说是 一.准备 工欲善其事~ 个人环境:windows10+wamp2.5+ZendStudio12: 项目名称:MVCEasyF ...
- go区块链学习教程之iris框架mvc架构
在Iris框架中,封装了mvc包作为对mvc架构的支持,方便开发者遵循mvc的开发原则进行开发. iris框架支持请求数据.模型.持久数据分层处理,并支持各层级模块代码绑定执行. MVC即:model ...
- ExtJS 4.2.1学习笔记(一)——MVC架构与布局
1 ExtJS入门 1.1 支持所有主流浏览器 调试推荐:chrome.Safari.Firefox 1.2 推荐目录结构 - appname (包含所有程序代码,是根目录 ...
- 设计模式之美学习(九):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
我们都知道,很多业务系统都是基于 MVC 三层架构来开发的.实际上,更确切点讲,这是一种基于贫血模型的 MVC 三层架构开发模式. 虽然这种开发模式已经成为标准的 Web 项目的开发模式,但它却违反了 ...
- PHP学习(MVC架构与面向对象)
想好好的学一下php中的一些面向对象的知识,以前只是为了打CTF随意的学了一下,但是为了以后的代码审计(准备PHP这边把thinkphp这个框架好好的学一下). PHP面向对象的基本知识 类与对象 类 ...
- 【JAVA】基于MVC架构Java技术荟萃案例演练
基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...
- MVC架构杂谈
来源:伯乐在线专栏作者 - 林欣达 链接:http://ios.jobbole.com/86895/ 点击 → 了解如何加入专栏作者 前言 MVC是软件工程中的一种软件架构模式,它把软件系统分为三个基 ...
- ExtJS 4 MVC架构讲解
大规模客户端应用通常不好实现不好组织也不好维护,因为功能和人力的不断增加,这些应用的规模很快就会超出掌控能力,ExtJS 4 带来了一个新的应用架构,不但可以组织代码,还可以减少实现的内容新的应用架构 ...
随机推荐
- Linux进程管理—信号、定时器
信号: 1. 信号的作用: 背景: 进程之间通信比较麻烦. 但进程之间又必须通信,比如父子进程之间. 作用: 通知其他进程响应.进程之间的一种通信机制. 信号: 接受信号的进程马上停止,调 ...
- SystemTimeToFileTime、FileTimeToLocalFileTime、LocalFileTimeToFileTime三函数的跨平台实现
// test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> #include & ...
- C语言 小游戏之贪吃蛇
还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...
- 2440test 裸机測试 调试不进main 设置改动方法
2440test没进main函数并非跑飞.bin文件已经烧写到开发板里了的 而是没选择载入文件,导致不能调试程序文件 主要设置例如以下:
- oracle4
分页查询 按雇员的id号升序取出 oracle的分页一共有三种方式 .根据rowid来分 ) ) order by cid desc; 执行时间0.03秒 .按分析函数来分 and rk> ...
- bitset使用
17.10使用序列1.2.3.5.8.13.21初始化一个bitset,将这些位置置位.对另一个bitset进行默认初始化,并编写一小段程序将其恰当的位置位. #include<iostream ...
- WebService学习笔记系列(四)
今天主要来看看服务端的编写及发布. 服务端的编写主要包括三个步骤: 1.编写一个接口,即SEI(server endpoint interface) 2.编写接口的实现类,即SIB (server i ...
- Android(java)学习笔记183:判断SD卡状态和存储空间大小
当我们在使用SD卡时候,如果我们想往SD卡里读写数据,我们必须在这之前进行一个逻辑判断,那就是判断SD卡状态和SD存储空间大小: 核心代码: String status = Environment.g ...
- ci 中使用 pdo 连接 mysql
ci 版本为 3.0.6 config/database.php 文件内容如下 $active_group = 'default'; $query_builder = TRUE; $db['defau ...
- C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器
今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...