01-MVC基礎(chǔ)

MVC的組成:Model(模型), View(視圖), Controller(控制器)

MVC的作用:其主要設(shè)計(jì)目標(biāo)是將用戶(hù)接口和邏輯層相分離郭脂,以便開(kāi)發(fā)人員更好關(guān)注邏輯層的設(shè)計(jì)和測(cè)試俊犯,并使整個(gè)程序具備清晰的架構(gòu)油宜。


001.png

一另伍、MVC主要概念

Model

模型對(duì)象是實(shí)現(xiàn)應(yīng)用程序數(shù)據(jù)域邏輯的應(yīng)用程序組件宪睹,通常被稱(chēng)為“數(shù)據(jù)模型”。模型對(duì)象會(huì)檢索模型狀態(tài)并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中岗照。

例如村象,Product(商品)對(duì)象可能會(huì)從數(shù)據(jù)庫(kù)中檢索信息,操作該信息攒至,然后將更新的信息寫(xiě)回到 SQL Server 數(shù)據(jù)庫(kù)內(nèi)的 Products(商品信息) 表中厚者。

Controller

控制器是處理用戶(hù)交互、使用模型并選擇視圖來(lái)顯示界面的組件迫吐。在 MVC 應(yīng)用程序中库菲,視圖僅顯示界面;控制器則用于處理和響應(yīng)用戶(hù)輸入和交互志膀。

例如熙宇,控制器處理查詢(xún)字符串值,并將這些值傳遞給模型溉浙,而模型可能會(huì)使用這些值來(lái)查詢(xún)數(shù)據(jù)庫(kù)烫止。

View

視圖是顯示應(yīng)用程序用戶(hù)界面 (UI) 的組件。 通常放航,此 UI 由模型數(shù)據(jù)創(chuàng)建烈拒。

例如,Products(商品信息)表的編輯視圖便是一個(gè)視圖广鳍,該視圖基于 Product(商品)對(duì)象的當(dāng)前狀態(tài)顯示文本框荆几、下拉列表和復(fù)選框等控件。

ASP.NET MVC 支持Razor視圖引擎赊时,所以視圖更多的采用CSHTML頁(yè)面吨铸。

二、創(chuàng)建.NET MVC項(xiàng)目

在VS開(kāi)發(fā)環(huán)境中祖秒,創(chuàng)建 .NET MVC項(xiàng)目由兩種形式:

(1)創(chuàng)建MVC項(xiàng)目:其中自動(dòng)集成了Jquery,Bootstrap诞吱,以及微軟提供了一個(gè)Demo示例。

(2)創(chuàng)建空MVC項(xiàng)目:其中只有Model竭缝,View房维,Controller等最主要的文件夾和文件內(nèi)容。

ASP.NET MVC應(yīng)用程序目錄說(shuō)明:

目錄 說(shuō)明
App_Start 包含多個(gè)靜態(tài)配置類(lèi)抬纸,執(zhí)行應(yīng)用程序的初始化任務(wù)
Content 放置應(yīng)用程序的靜態(tài)內(nèi)容咙俩,如:CSS、可下載的文件、音樂(lè)文件阿趁、…
Controller 放置控制器文件膜蛔。控制器文件是后綴名.cs或.vb的類(lèi)文件
Models 放置數(shù)據(jù)模型對(duì)象的文件脖阵,例如:.cs皂股、.vb、.edmx命黔、.dbml呜呐、…
Views 放置視圖文件,文件后綴名為.cshtml或.aspx
Scripts 放置JavaScript纷铣、jQuery文件

三卵史、Hello,World

下面我們利用控制器和視圖,編寫(xiě)第一個(gè).NET MVC項(xiàng)目搜立,在頁(yè)面顯示Hello,World

(1)在Controller文件夾中創(chuàng)建一個(gè)空控制器,命名為"HomeController"槐秧,(控制器的命名規(guī)則要求以Controller結(jié)尾)啄踊。

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            return View();
        }
    }
}

(2)在Index()函數(shù)里面點(diǎn)擊右鍵--》添加視圖,系統(tǒng)會(huì)在View文件夾創(chuàng)建Home文件夾刁标,Home文件夾中創(chuàng)建index.cshtml,如下:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
    </div>
</body>
</html>

(3)在body的div中插入文本颠通,然后瀏覽此文件,瀏覽地址為:http://域名:端口/控制器名字(Home)/Action名字(Index)

四膀懈、控制器向視圖共享數(shù)據(jù)

控制器向視圖傳遞少量數(shù)據(jù)顿锰,常見(jiàn)三種為:

ViewData:字典類(lèi)型,存放的是鍵/值對(duì)數(shù)據(jù)启搂。ViewData只在一次HTTP請(qǐng)求中有效硼控,當(dāng)這次請(qǐng)求結(jié)束后,會(huì)自動(dòng)清空其值胳赌。

ViewBag:相當(dāng)于ViewData牢撼,但是內(nèi)在的實(shí)現(xiàn)卻完全不一樣。 ViewBag存放的不是鍵值對(duì)數(shù)據(jù)疑苫,而是dynamic動(dòng)態(tài)類(lèi)型數(shù)據(jù)熏版。

TempData:默認(rèn)保存在Session中,控制器每次請(qǐng)求從Session中獲取TempData捍掺,然后清除Session撼短。基于這樣的事實(shí)挺勿,在每次請(qǐng)求結(jié)束后曲横,TempData的生命周

期同時(shí)結(jié)束。

1满钟、ViewData共享數(shù)據(jù)

自定義類(lèi)支持代碼:

public class Employee
{
    public int EmpId { get; set; }
    public string EmpName { get; set; }
    public string EmpPhone { get; set; }
}

控制器代碼如下:

public ActionResult Index()
{
    //ViewData胜榔,字典類(lèi)型胳喷,存放的是鍵/值對(duì)數(shù)據(jù)。
    //ViewData只在一次HTTP請(qǐng)求中有效夭织,當(dāng)這次請(qǐng)求結(jié)束后吭露,會(huì)自動(dòng)清空其值。
    Employee emp = new Employee();
    emp.EmpId = 1;
    emp.EmpName = "孫悟空";
    emp.EmpPhone = "13558969651";
    ViewData["Emp"] = emp;
    ViewData["Info"] = "這是我的第一個(gè)MVC程序尊惰!";
    return View();
}

視圖展示數(shù)據(jù):

<div> 
    <h1>
        @ViewData["Info"].ToString()
    </h1>
    <h2>員工基本信息如下:</h2>
    @{  
        Employee emp = (Employee)ViewData["Emp"];
    }
    <p>編號(hào):@emp.EmpId</p>
    <p>姓名:@emp.EmpName</p>
    <p>電話:@emp.EmpPhone</p>
</div>

2讲竿、ViewBag共享數(shù)據(jù)

自定義類(lèi)支持代碼:

public class Employee
{
    public int EmpId { get; set; }
    public string EmpName { get; set; }
    public string EmpPhone { get; set; }
}

控制器代碼如下:

public ActionResult Default()
{
    //ViewBag,相當(dāng)于ViewData弄屡,但是內(nèi)在的實(shí)現(xiàn)卻完全不一樣昼激。 
    //ViewBag存放的不是鍵值對(duì)數(shù)據(jù),而是dynamic動(dòng)態(tài)類(lèi)型數(shù)據(jù)燥翅。
    Employee emp = new Employee();
    emp.EmpId = 1;
    emp.EmpName = "孫悟空";
    emp.EmpPhone = "13558969651";
    ViewBag.Emp = emp;
    ViewBag.Info = "這是我的第一個(gè)MVC程序拿穴!";
    return View();
}

視圖展示數(shù)據(jù):

<div>
    <h1>
        @ViewBag.Info
    </h1>
    <h2>員工基本信息如下:</h2>
    <p>編號(hào):@ViewBag.Emp.EmpId</p>
    <p>姓名:@ViewBag.Emp.EmpName</p>
    <p>電話:@ViewBag.Emp.EmpPhone</p>
</div>

3、TempData的使用

以下代碼模擬一個(gè)登錄請(qǐng)求全庸,使用TempData保存提示數(shù)據(jù)秀仲,因?yàn)門(mén)empData在一次跳轉(zhuǎn)后仍然可以保存數(shù)據(jù)。

用戶(hù)登錄頁(yè)面對(duì)應(yīng)的Action:

//TempData壶笼,默認(rèn)保存在Session中神僵,控制器每次請(qǐng)求從Session中獲取TempData,然后清除Session覆劈。
//基于這樣的事實(shí)保礼,在每次請(qǐng)求結(jié)束后,TempData的生命周期同時(shí)結(jié)束责语。
public ActionResult LoginForm()
{
    return View();
}

用戶(hù)登錄頁(yè)面的視圖:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>LoginForm</title>
    <style type="text/css">
        div, table, tr, td { margin:0px; padding:0px;}
        .myTable { width:800px; margin:20px auto;  border-collapse:collapse; }
            .myTable td { height:30px; line-height:30px; padding:6px;
            } 
    </style>
</head>
<body>
    <form method="post" action="~/Home/Login">
        <div style="text-align:center;">
            <table width="800" class="myTable" border="1">
                <tr>
                    <td colspan="2" align="center" style="font-weight:bold;">用戶(hù)登錄</td>
                </tr>
                <tr>
                    <td width="200" align="right">用戶(hù)名:</td>
                    <td width="600" align="left"><input type="text" name="txtAccount" /></td>
                </tr>
                <tr>
                    <td width="200" align="right">密碼:</td>
                    <td width="600" align="left"><input type="password" name="txtPwd" /></td>
                </tr>
                <tr>
                    <td width="200" align="right"></td>
                    <td width="600" align="left">
                        <input type="submit" value="登錄" />
                        @TempData["ErrInfo"]
                    </td>
                </tr>
            </table>
        </div>
    </form>
</body>
</html>

用戶(hù)登錄請(qǐng)求的Action:

public ActionResult Login()
{
    //假設(shè)用戶(hù)名 admin,密碼 admin 才能登錄成功炮障,其它登錄失敗
    string acc = Request["txtAccount"].ToString();
    string pwd = Request["txtPwd"].ToString();
    if (acc.Equals("admin") && pwd.Equals("admin"))
    {
        return RedirectToAction("WelComeForm");
    }
    else
    {
        TempData["ErrInfo"] = "用戶(hù)名或密碼錯(cuò)誤"; //TempData可以在跳轉(zhuǎn)后保存接受數(shù)據(jù),但只會(huì)在一次跳轉(zhuǎn)中保存鹦筹。
        return RedirectToAction("LoginForm");
    }         
}

登錄成功跳轉(zhuǎn)的歡迎頁(yè)面Action:

public ActionResult WelComeForm()
{
    return View();
}

登錄成功跳轉(zhuǎn)的歡迎頁(yè)面視圖:

<div> 
    <h1>歡迎來(lái)到********公司OA管理系統(tǒng)铝阐!</h1>
</div>

五、同名Action

同樣去實(shí)現(xiàn)上面的模擬登錄的功能铐拐,在上面的例子中徘键,我們編寫(xiě)了兩個(gè)Action,分別是LoginForm和Login用來(lái)打開(kāi)登錄的頁(yè)面和接受處理登錄的請(qǐng)求遍蟋。

我們也可以編寫(xiě)兩個(gè)同名的Action吹害,兩個(gè)Action名字都叫Login,我們使用請(qǐng)求方式的不同進(jìn)行區(qū)分兩個(gè)Action虚青。

用戶(hù)登錄頁(yè)面對(duì)應(yīng)的Action:

//TempData它呀,默認(rèn)保存在Session中,控制器每次請(qǐng)求從Session中獲取TempData,然后清除Session纵穿。
//基于這樣的事實(shí)下隧,在每次請(qǐng)求結(jié)束后,TempData的生命周期同時(shí)結(jié)束谓媒。
public ActionResult Login()
{
    return View();
}

用戶(hù)登錄頁(yè)面的視圖:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>LoginForm</title>
    <style type="text/css">
        div, table, tr, td { margin:0px; padding:0px;}
        .myTable { width:800px; margin:20px auto;  border-collapse:collapse; }
            .myTable td { height:30px; line-height:30px; padding:6px;
            } 
    </style>
</head>
<body>
    <form method="post" action="~/Home/Login">
        <div style="text-align:center;">
            <table width="800" class="myTable" border="1">
                <tr>
                    <td colspan="2" align="center" style="font-weight:bold;">用戶(hù)登錄</td>
                </tr>
                <tr>
                    <td width="200" align="right">用戶(hù)名:</td>
                    <td width="600" align="left"><input type="text" name="txtAccount" /></td>
                </tr>
                <tr>
                    <td width="200" align="right">密碼:</td>
                    <td width="600" align="left"><input type="password" name="txtPwd" /></td>
                </tr>
                <tr>
                    <td width="200" align="right"></td>
                    <td width="600" align="left">
                        <input type="submit" value="登錄" />
                        @TempData["ErrInfo"]
                    </td>
                </tr>
            </table>
        </div>
    </form>
</body>
</html>

用戶(hù)登錄請(qǐng)求的Action:

[HttpPost]
public ActionResult Login()
{
    //假設(shè)用戶(hù)名 admin,密碼 admin 才能登錄成功淆院,其它登錄失敗
    string acc = Request["txtAccount"].ToString();
    string pwd = Request["txtPwd"].ToString();
    if (acc.Equals("admin") && pwd.Equals("admin"))
    {
        return RedirectToAction("WelComeForm");
    }
    else
    {
        TempData["ErrInfo"] = "用戶(hù)名或密碼錯(cuò)誤"; //TempData可以在跳轉(zhuǎn)后保存接受數(shù)據(jù),但只會(huì)在一次跳轉(zhuǎn)中保存句惯。
        return RedirectToAction("Login");
    }         
}

登錄成功跳轉(zhuǎn)的歡迎頁(yè)面Action:

public ActionResult WelComeForm()
{
    return View();
}

登錄成功跳轉(zhuǎn)的歡迎頁(yè)面視圖:

<div> 
    <h1>歡迎來(lái)到********公司OA管理系統(tǒng)土辩!</h1>
</div>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抢野,隨后出現(xiàn)的幾起案子拷淘,更是在濱河造成了極大的恐慌,老刑警劉巖指孤,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启涯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡邓厕,警方通過(guò)查閱死者的電腦和手機(jī)逝嚎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)详恼,“玉大人,你說(shuō)我怎么就攤上這事引几∶粱ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵伟桅,是天一觀的道長(zhǎng)敞掘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)楣铁,這世上最難降的妖魔是什么玖雁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮盖腕,結(jié)果婚禮上赫冬,老公的妹妹穿的比我還像新娘。我一直安慰自己溃列,他們只是感情好劲厌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著听隐,像睡著了一般补鼻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天风范,我揣著相機(jī)與錄音咨跌,去河邊找鬼。 笑死硼婿,一個(gè)胖子當(dāng)著我的面吹牛锌半,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播加酵,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拳喻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了猪腕?” 一聲冷哼從身側(cè)響起冗澈,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陋葡,沒(méi)想到半個(gè)月后亚亲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腐缤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年捌归,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岭粤。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜索,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剃浇,到底是詐尸還是另有隱情巾兆,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布虎囚,位于F島的核電站角塑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淘讥。R本人自食惡果不足惜圃伶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒲列。 院中可真熱鬧窒朋,春花似錦、人聲如沸嫉嘀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剪侮。三九已至拭宁,卻和暖如春洛退,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杰标。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工兵怯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腔剂。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓媒区,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掸犬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袜漩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容