不用asp.net MVC,用WebForm照样能够实现MVC
? 在《避開WebForm天坑,擁抱ASP.Net?MVC吧》這篇博客中我講到了ASP.net?WebForm由于一些先天的“誘導犯罪”的缺陷,如今用ASP.net?MVC的公司越來越多。可是依據那篇文章末尾的"ASP.net?MVC的免費網絡公開課"調查表的統計,我們發現有一大半的人還沒有使用過ASP.Net?MVC。而沒用過ASP.net?MVC的人中居然有非常多人人是由于感覺ASP.Net?難、沒時間學。調查表分析數據例如以下:
?
?
? ? 初看ASP.net確實難:復雜的路由機制、?ViewData/ViewBag/TempData、過濾器、Razor、Layout、XXXHelper、驗證、WebAPI、依賴注入、單元測試……光看這一堆概念頭就暈了。“還是拖控件簡單”。
? ? 事實上學習一個新的框架,僅僅要搞清他的原理就會“豁然開朗”,再看其它的東西就不會感覺恐懼了。
? ? 這篇文章我將會帶著大家搞明確什么叫MVC模式。而且帶著大家用大家熟悉的Asp.Net?WebForm實現MVC。
? ? 對!
你沒聽錯!
? ? 用Asp.Net?WebForm實現MVC!
?
? ? 再次感受一下ASP.net WebForm吧。
? ?如果有一個Person對象的集合,我們要在網頁中以html渲染。那么要例如以下編寫
| 1 2 3 4 5 | <table> ????????<asp:Repeater?ID="Repeater1" runat="server"> ????????????<ItemTemplate><tr><td><%#Eval("Name") %></td><td><%#Eval("Age") %></td></tr></ItemTemplate> ????????</asp:Repeater> </table> |
C#代碼:
if(!IsPostBack) { List<Person> list = new List<Person>(); list.Add(new Person { Name = "rupeng", Age = 8 }); list.Add(new Person { Name = "qq", Age = 18 }); Repeater1.DataSource = list; Repeater1.DataBind(); }?
這樣做的缺點是C#代碼中訪問了apsx中的控件Repeater1。也就是在aspx中必需要有一個Repeater類型、Id為Repeater1的控件,這樣aspx就和C#代碼耦合在了一起。麻煩在哪兒呢?
1)假設aspx有兩個地方都要用list了,那么就要寫兩組DataSource=list;DataBind()。
2)假設aspx中突然不想要Repeater了,把Repeater1刪掉C#代碼就會報錯
3)Aspx中忽然不想用Repeater進行數據的顯示了,想換別的控件,那么C#代碼也要改
?
再比方。在ASP.Net?WebForm中,實現加法計算器會例如以下實現:
| 1 2 3 4 | <asp:TextBox?ID="TextBox1" runat="server"></asp:TextBox> +<asp:TextBox?ID="TextBox2" runat="server"></asp:TextBox> <asp:Button?ID="Button1" runat="server" OnClick="Button1_Click" Text="=" /> <asp:TextBox?ID="TextBox3" runat="server"></asp:TextBox> |
?
protected void Button1_Click(object sender, EventArgs e) {int i1 = Convert.ToInt32(TextBox1.Text);int i2 = Convert.ToInt32(TextBox2.Text);int i3 = i1 + i2;TextBox3.Text = i3.ToString(); }?
? ? 后臺的C#代碼和aspx的耦合要求aspx視圖中必須有三個名字各為TextBox1、TextBox2、TextBox3的TextBox類型的server控件。
假設我想把計算的結果從TextBox改成span就不行。
前端設計人員看到TextBox絕對沒有input親切。前端人員對input?的把控能力會被TextBox更好。另外不必再說WebForm引入的ViewState、頁面生命周期、ClientID等令人作嘔的問題。?
? ? 有同學會說了:你有病嗎,開發時候aspx怎么可能總是變來變去,即使aspx變了,你C#代碼也就變唄。有什么大不了的?
? ? 假設說系統小的話可能無所謂,對于比較復雜的系統,假設aspx和C#這樣緊密的耦合。維護還會特別麻煩。并且假設實現像一些CMS系統那樣能夠動態改動模板文件的話就是存在著“C#無法預測、無法強制要求aspx究竟怎么寫”的問題。
?
? ? 這還不過展示一個集合的問題。假設要展示復雜的扁平化數據或者須要從用戶輸入中獲取數據,用這樣的方式更災難。
? ? 那么MVC思想怎么解決呢?邏輯代碼(Controller)不直接和頁面視圖(View)進行交互,他們之間用Model(數據模型)作為溝通的通道。當須要展示數據的時候由Controller收集到數據(Model)。然后把數據交給View去展示;當Controller須要讀取View中用戶輸入內容的時候,框架會把View中的數據映射到Model中,然后Controller讀取Model中的數據進行興許的邏輯處理。這樣就把邏輯代碼(俗稱C#代碼)和視圖(俗稱頁面)進行解耦了。
? ? 光說概念沒用。還是先看代碼把。以下使用MVC模式改造的“顯示Person集合”:
?
View視圖PersonsView.aspx
<%@ Page Language="C#"%> <%@ Import Namespace="System.Collections.Generic" %> <%@ Import Namespace="WebApplication1" %> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body><table><%var persons = (List<Person>)Context.Items["persons"];foreach(var person in persons){%><tr><td><%=person.Name %></td><td><%=person.Age %></td></tr><%} %></table> </body> </html>?
注意,我把aspx相關的兩個自己主動生成的.cs文件刪掉了,而且把<%@Page%>標簽的AutoEventWireup、CodeBehind、Inherits等幾個屬性也都干掉了,這樣aspx就變成了一個純粹的“模板引擎”
?
作為Controller的Index.ashx的代碼例如以下:
public void ProcessRequest(HttpContext context) {List<Person> list = new List<Person>();list.Add(new Person { Name="rupeng",Age=8});list.Add(new Person { Name = "qq", Age = 18 });context.Items["persons"] = list;context.Server.Transfer("PersonsView.aspx"); }?
? ? ?這里借鑒了JSP中“request.getRequestDispatcher("index.jsp").forward(request,response)”一樣的思路。
? ? ?context.Server.Transfer是在server內部把請求處理權轉交給"PersonsView.aspx"處理。HttpContext中的Items的生命周期是整個請求響應,這樣我們在一般處理程序中把數據放到context.Items中。然后在"PersonsView.aspx"中就能夠能夠通過Context.Items["persons"]拿到這個數據從而進行數據的展示。
? ? ?為什么把數據放到HttpContext.Items中呢。因為Transfer不過server內部處理權的轉接。可是仍然是在一個請求中的,所以放到Context.items是最好的。
假設放到Session、Application等中會有并發的問題。
?
? ? 這樣Controller(一般處理程序)和View(aspx)之間僅僅要維持一個“要傳遞一個名字為persons類型的List<Person>”這樣一個弱耦合關系就可以,至于aspx用不用這個persons、用幾次persons、怎么用persons。你Controller都不用管。?
依照相同方法改造加法計算器
?
以下是視圖AddView.aspx的代碼
<%@ Page Language="C#"%> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head><%dynamic viewBag = Context.Items["ViewBag"]; %> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>加法計算器</title> </head> <body><form id="form1"><input type="hidden" name="action" value="addSubmit" /><input type="text" name="i1" value="<%=viewBag.i1 %>" />+<input type="text" name="i2" value="<%=viewBag.i2%>" /><input type="submit" value="=" /><input type="text" value="<%=viewBag.i3 %>" /></form> </body> </html>而AddHandler.ashx的主體代碼例如以下:
public void ProcessRequest(HttpContext context) {string action = context.Request["action"];dynamic viewBag = new System.Dynamic.ExpandoObject();if(string.IsNullOrEmpty(action)){ viewBag.i1 = ""; viewBag.i2 = ""; viewBag.i3 = ""; }else if(action=="addSubmit"){ int i1 = Convert.ToInt32(context.Request["i1"]); int i2 = Convert.ToInt32(context.Request["i2"]); int i3 = i1 + i2; viewBag.i1 = i1; viewBag.i2 = i2; viewBag.i3 = i3;}context.Items["ViewBag"] = viewBag;context.Server.Transfer("AddView.aspx"); }?
? ? 因為View和Controller之間傳遞的數據比較復雜、比較多。為了簡化開發,這樣用了dynamic?動態類型。熟悉ASP.Net?MVC的同學是不是感覺這個和ASP.net?MVC中的ViewBag異曲同工呢。
? ? 在這個加法計算器中假設我想把結算結果用span顯示。那么僅僅要把<input?type="text"?name="i2"?value="<%=viewBag.i2%>"?/>改成<span><%=viewBag.i2%></span>就能夠了。美工也easy介入頁面美化。
? ??假設我想把頁面的Title從“加法計算器”改成“3和5相加的結果”,那么僅僅要這樣改就能夠:<title><%=viewBag.i1?%>和<%=viewBag.i2?%>相加的結果</title>????這樣model里的數據我aspx想用幾次用幾次,想怎么用就怎么用。
有沒有感覺到和WebForm不一樣的地方呢?
?
? ?所以僅僅要思想想通了,事實上實現MVC模式不一定要用ASP.net?MVC。我見過非常多項目都是自己搞的MVC機制。
? ? 當然既然ASP.net?MVC已經這么優秀了,普通情況不是必需像我這樣又一次自己發明一個輪子用。這里給大家講ASPX實現MVC僅僅是用大家熟悉的東西讓大家明確原理,project項目應用還是用ASP.Net?MVC吧。
如鵬網.Net培訓班正在報名,有網絡的地方就能夠參加如鵬網的學習,學完就能高薪就業,點擊此處了解
?
三年前僅僅要懂“三層架構”就能夠說“精通分層架構”。如今則須要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;
三年前僅僅要會SQLServer就能夠說自己“精通數據庫開發”;如今則需還須要掌握MySQL等開源數據庫才干說是“.Net開源”時代的程序猿;
三年前僅僅要會進行用戶上傳內容的安全性處理就可以;如今則須要熟悉云存儲、CDN等才干在云計算時代游刃有余。
三年前僅僅要掌握Lucene.Net就會說自己“熟悉站內搜索引擎開發”;如今大家都用ElasticSearch了,你還用Lucene.Net就太老土了。
三年前發郵件還是用SmtpClient;如今做大型站點發郵件必須用云郵件引擎;
三年前緩存就是Context.Cache。如今則是Redis、Memcached的天下;
如鵬網再次引領.Net社區技術潮流!點擊此處了解如鵬網.Net最新課程
轉載于:https://www.cnblogs.com/zsychanpin/p/7029322.html
總結
以上是生活随笔為你收集整理的不用asp.net MVC,用WebForm照样能够实现MVC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android报“android.con
- 下一篇: 在TextView中实时显示数据