做爲一名小小的GreenBird,學習MVC呢,已經花費了2天了,期間獲得了美麗的學姐的幫助,初步整理了一下。html
首先,學習MVC呢就先以一個標準的MVC的簡單的例子來入手,而後根據學姐的PPT,我用vs2012創建了一個項目。數據庫
1.創建一個MVC架構的項目:瀏覽器
File->New Project->Visual C#->ASP.NET MVC 4 Web Application架構
能夠直接運行這個網站mvc
2.Adding a Controllerasp.net
右鍵單擊Controller->add->Controller(CommentControler)函數
public string Index()學習
{網站
return "This is my first test of <b>MVC</b>...";url
}
把原來的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)
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