日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
ASP.NETMVC并不僅僅只是LINQToSQL

ASP.NET MVC是微軟官方提供的MVC模式編寫ASP.NET Web應(yīng)用程序的一個(gè)框架,不久前微軟發(fā)布了ASP.NET MVC 2 RC 2,新版本增強(qiáng)了對(duì)HTML的控制,同時(shí)對(duì)Area特性也有一定的增強(qiáng),而在不久之后也將會(huì)支持Visual Studio 2010。

成都創(chuàng)新互聯(lián)公司為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括做網(wǎng)站、網(wǎng)站設(shè)計(jì)、app軟件定制開發(fā)、小程序開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。 

這里我們只是講述各個(gè)層所扮演的角色,但是不會(huì)深入到代碼的細(xì)節(jié)中。N-Layer構(gòu)架的三個(gè)關(guān)鍵層分別為:業(yè)務(wù)對(duì)象層,業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層。而其數(shù)據(jù)訪問層會(huì)幾乎不加改變的包含在本文的MVC項(xiàng)目中,Spaanjaar的文件詳細(xì)描述了各個(gè)層是如何組織的。

首先,我們來看Imar提供的程序,這是一個(gè)具有典型增刪查改的程序,這個(gè)程序允許用戶管理聯(lián)系人,包括聯(lián)系人的地址,電話,email。它能增,刪,查,改任何實(shí)體。

程序內(nèi)包括的實(shí)體有:ContactPersons,PhoneNumbers,AddressesEmailAddresses.他們都隸屬于程序的業(yè)務(wù)對(duì)象(BO)層。上述的每一個(gè)類都包含可以獲取或者賦值的屬性,但并不包含任何方法。而所有方法存放于業(yè)務(wù)邏輯層(BLL)中的對(duì)應(yīng)類中。在業(yè)務(wù)對(duì)象層和業(yè)務(wù)邏輯層的實(shí)體和實(shí)體manger是一對(duì)一的關(guān)系,在業(yè)務(wù)邏輯層中類包含的方法都會(huì)返回業(yè)務(wù)對(duì)象層(BO)的實(shí)例,或是實(shí)例集合,或者保存實(shí)例(更新或是添加),或是刪除實(shí)例。業(yè)務(wù)邏輯層(BLL)中也可以包含一些業(yè)務(wù)規(guī)則驗(yàn)證,安全性檢查的代碼。但在本篇文章為了簡(jiǎn)便起見,就不添加這些了。如果你對(duì)業(yè)務(wù)規(guī)則和安全性有興趣的話,可以去看Imar文章的6partseries。

最后一層是數(shù)據(jù)訪問層(DAL),同樣,DAL層的類也和業(yè)務(wù)邏輯層(BLL)內(nèi)的類有著一對(duì)一的關(guān)系,在BLL層的類中會(huì)調(diào)用相關(guān)DAL層中的方法。而在這些層中,只有DAL層需要知道利用什么技術(shù)(linq,entityframework..)保存業(yè)務(wù)實(shí)體。在本例中,使用SqlServerExpress數(shù)據(jù)庫和ADO.NET。而這樣分層的思想是如果你需要更換數(shù)據(jù)源(XML,oracle,更或者是WebService甚至是LinqtoSql或者其他ORM框架),因?yàn)镈AL層給BLL層暴漏的方法的簽名是一致的,所以只需要更換DAL層即可。而為了保證所有DAL的實(shí)現(xiàn)有著同樣的簽名,則利用接口即可。但我想或許是未來帖子中討論的話題了吧。

MVC構(gòu)架

簡(jiǎn)單的說,M代表Model,也是包含BO,BLL,DAL的地方,V代表View,也是UI相關(guān)開發(fā)的部分,或者說是用戶看到的部分,C是Controller的簡(jiǎn)寫,也是控制用戶請(qǐng)求與程序回復(fù)的部分。如果用戶點(diǎn)擊了一個(gè)指向特定地址的按鈕,請(qǐng)求會(huì)和Controller的Action(類的方法)進(jìn)行匹配,而Action負(fù)責(zé)處理請(qǐng)求,并返回響應(yīng)。通常情況下是一個(gè)新的View,或者是更新現(xiàn)有的View。

下面用VisualStudio創(chuàng)建一個(gè)MVC應(yīng)用程序并刪除默認(rèn)的View和Controller,然后將Imar的程序中的Bo,Bll和DAL復(fù)制到這個(gè)MVC程序的Model內(nèi),我還復(fù)制了響應(yīng)的數(shù)據(jù)庫文件和Style.css。

我還做了一些其他的修改,把數(shù)據(jù)庫連接字符串添加到Web.Config中。除此之外,我還將復(fù)制過來的代碼的命名空間做了響應(yīng)的調(diào)整并把DAL層的代碼升級(jí)到了3.0.雖然這并不是必須的。做完這些,我按Ctrl+Shift+F5來測(cè)試是否編譯成功。

Controller

添加4個(gè)Controller(VisualStudio附帶的默認(rèn)Controller已經(jīng)被刪除),和四個(gè)實(shí)體類相匹配。它們分別為:ContactController,PhoneController,AddressControllerandEmailController。

每個(gè)Controller都含有四個(gè)Action:List,Add,Edit,andDelete。首先需要在Global.exe中為這些Action注冊(cè)這些路由。

 
 
 
 
  1. public static void RegisterRoutes(RouteCollection routes)
  2. {
  3.   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  4.   routes.MapRoute(
  5.       "Default",                                              
  6.       "{controller}/{action}/{id}",                           
  7.       new { controller = "Contact", action = "List", id = "" }  
  8.   );
  9. }

默認(rèn)的View會(huì)顯示所有聯(lián)系人,BLL層中的ContactPersonManager類內(nèi)的GetList()方法會(huì)獲取所有聯(lián)系人的數(shù)據(jù),響應(yīng)的List()Action代碼如下:

 
 
 
 
  1. public ActionResult List()
  2. {
  3.   var model = ContactPersonManager.GetList();
  4.   return View(model);
  5. }

#p#

強(qiáng)類型View

整個(gè)實(shí)例代碼中,我都會(huì)使用強(qiáng)類型的View,因?yàn)檫@樣不僅可以使用intellisense(智能提示)的好處,還不必依賴于使用String作為索引值的ViewData。為了讓代碼更加有序,我添加了一些命名空間到web.config中的節(jié)點(diǎn),這些都是我用來替換Imar代碼的方式:

 
 
 
 

上面代碼意味著我可以在程序的任何地方訪問上述命名空間。上面GetList()方法返回的類型是ContactPersonList,這個(gè)類型是ContactPerson對(duì)象的集合,在顯示List的View中的Page聲明如下:

 
 
 
 
  1. <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

我想你已經(jīng)注意到了我使用了MasterPage,利用MasterPage,我借用了從Imar實(shí)例代碼中的Css文件。用于顯示ContactPerson對(duì)象的HTML如下:

 
 
 
 
  1.     
  2.       Id
  3.       Full Name
  4.       Date of Birth
  5.       Type
  6.        
  7.        
  8.        
  9.        
  10.          
  11.     
  12.     <%
  13.       if (Model != null)
  14.       {
  15.         foreach (var person in Model)
  16.         {%>
  17.     
  18.       <%= person.Id %>
  19.       <%= person.FullName %>
  20.       <%= person.DateOfBirth.ToString("d") %>
  21.       <%= person.Type %>
  22.       Addresses
  23.       Email
  24.       Phone Numbers
  25.       Edit
  26.       Delete
  27.     
  28.     <%
  29.         }
  30.       }else{%>
  31.     
  32.       No Contacts Yet
  33.       
  34.      <% }%>
  35.   

我想你已經(jīng)能發(fā)現(xiàn)強(qiáng)類型View的好處了吧,Model的類型是ContactPersonList,所以你可以任意使用ContactPersonList的屬性而不用強(qiáng)制轉(zhuǎn)換,而強(qiáng)制轉(zhuǎn)換錯(cuò)誤只有在運(yùn)行時(shí)才能被發(fā)現(xiàn),所以這樣省了不少事。

在做Html時(shí),我小小的作弊了一下,我本可以使用vs對(duì)list自動(dòng)生成的view,但我沒有。因?yàn)槲倚枰虸mar的css文件相匹配的html.所以我運(yùn)行了imar的程序,在瀏覽器中查看源代碼,并把生成的html復(fù)制下來,imar使用GridView來生成列表,所以CSS會(huì)在運(yùn)行時(shí)嵌入到html代碼中。我將這些css代碼移到一個(gè)外部的css文件中。并給和元素添加了一些額外樣式,你可以在代碼的下載鏈接中找到。

我還未一些表格的單元格添加了title屬性。這些包含了訪問其他action的鏈接。我希望用戶在瀏覽電話本或者編輯或者刪除電話本時(shí)頁面不會(huì)postback,換句話說,我希望我的網(wǎng)站是ajax的。而title屬性就發(fā)揮作用了。而“。link”這個(gè)css選擇符可以讓普通的文本看起來像超鏈接,也就是有下劃線和鼠標(biāo)hover時(shí)出現(xiàn)小手。#p#

JQuery Ajax

在我們深入實(shí)現(xiàn)ajax功能的相關(guān)代碼之前,下面3行代碼是需要加入到html中:

 
 
 
 
  • Are you sure about this?
  • 第一行代碼的作用是一個(gè)允許用戶添加新聯(lián)系人的按鈕,第二行代碼是一個(gè)空div,方便后面顯示信息,第三行代碼是jQuerymodal提示驗(yàn)證對(duì)話框的一部分,用于提示用戶是否刪除一條記錄。

    還需要在頁面中添加3個(gè)js文件,第一個(gè)是主要的jQuery文件,其他兩個(gè)分別是jQueryUI的核心js,以及datepicker和modaldialog部分的JS:

     
     
     
     

    下面是我們生成后的列表顯示視圖以及完全的JS代碼:

     
     
     
     

    上面代碼看起來讓人望而卻步,但實(shí)際上,使用jQuery,這非常簡(jiǎn)單。并且在上面代碼中我多處加入了注釋,代碼一開始是用js代碼是替換了數(shù)據(jù)源控件默認(rèn)呈現(xiàn)出來的隔行變色的顏色。然后我加入了使點(diǎn)擊行點(diǎn)擊時(shí)可以變色的代碼。然后下面的代碼是防止IE對(duì)頁面進(jìn)行緩存。如果不禁止了IE緩存,你會(huì)為執(zhí)行編輯或者刪除以后,數(shù)據(jù)庫改變了但頁面卻沒有發(fā)生變化而撞墻的。

    接下來的代碼更有趣了,依靠live()方法可以確$選擇器中所有匹配的元素都被附加了相應(yīng)的事件,無論元素當(dāng)前是否存在于頁面中。比如說,當(dāng)你點(diǎn)擊了Addresses鏈接,相應(yīng)的結(jié)果就會(huì)在另一個(gè)表中出現(xiàn):

    上圖中可以看出表中包含編輯和刪除鏈接,如果不使用live()方法,相應(yīng)的鏈接就不會(huì)被附加事件。所有具有class為link的元素都會(huì)被委派上click事件。這個(gè)事件會(huì)首先獲取到當(dāng)前條目的id.以ContactPerson表為例,這個(gè)id就是ContactPersonId.在相應(yīng)的子表中,則id會(huì)是電話號(hào)碼或者是email地址。這些都是需要傳遞給controlleraction作為參數(shù)進(jìn)行編輯,刪除,或者顯示的。

    你現(xiàn)在可以看出為什么我為每個(gè)單元格加上title屬性了吧。title屬性包含相關(guān)的route信息,而完全的url則把id附加到route作為url.然后,上面js會(huì)做一個(gè)檢查,來看route信息內(nèi)是否包含delete,如果包含delelte,則彈出一個(gè)對(duì)話框來提示用戶是否要?jiǎng)h除??矗遣皇呛芎?jiǎn)單?最后,代碼會(huì)為添加聯(lián)系人按鈕添加click事件。 #p#

    添加聯(lián)系人以及自定義ViewModels

    使用添加一條記錄時(shí),通常的做法是提供一個(gè)包含一系列輸入框的form.對(duì)于ContactPerson類的大多屬性來說,都是可以直接賦值的,比如:姓,名字,生日。但是其中有一個(gè)屬性卻不能直接賦值--Type屬性,這個(gè)值是從PersonType.cs(朋友,同事等)中的枚舉類型中選擇出來的.這意味著用戶只能從有限的幾種選項(xiàng)中選擇一種??梢杂肈ropDwonList來實(shí)現(xiàn),但是ContactPerson對(duì)象并不包含枚舉類型的所有選項(xiàng),所以我們只能提供一個(gè)自定義版本的ContactPerson類傳遞給View。這也是為什么要用到自定義ViewModel。

    我看過很多關(guān)于在程序的哪里放置ViewModels的討論,有些人認(rèn)為自定義ViewModels是Model的一部分,但是我認(rèn)為它和View緊密相關(guān),ViewModels并不是MVC程序必不可少的一部分,也不能服用,所以它不應(yīng)該放到Model中區(qū)。我把所有的ViewModel放入一個(gè)創(chuàng)建的ViewModel文件夾下,ContactPersonViewModel.cs的源代碼如下:

     
     
     
     
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Web.Mvc;
    4. namespace ContactManagerMVC.Views.ViewModels
    5. {
    6.   public class ContactPersonViewModel
    7.   {
    8.     public int Id { get; set; }
    9.     public string FirstName { get; set; }
    10.     public string MiddleName { get; set; }
    11.     public string LastName { get; set; }
    12.     public DateTime DateOfBirth { get; set; }
    13.     public IEnumerable Type { get; set; }
    14.   }
    15. }

    看上面類的最后一個(gè)屬性,我將這個(gè)type屬性設(shè)置成IEnumerable類型,這樣就可以將Type綁定到View中的Html.DropDownList了。

    對(duì)應(yīng)的,也要在Controller中添加2個(gè)action,第一個(gè)action使用AcceptVerbs(HttpVerbs.Get)標(biāo)簽,第二個(gè)action使用AcceptVerbs(HttpVerbs.Post)標(biāo)簽,第一個(gè)方法用于從服務(wù)器向客戶端傳值,第一個(gè)方法處理從form提交的數(shù)據(jù)。

    上面第一個(gè)action的前幾行代碼將ContactType枚舉類型轉(zhuǎn)換成數(shù)組,數(shù)組中的每一個(gè)元素都是一個(gè)包含id和name屬性的匿名對(duì)象,id是枚舉值,Name是和對(duì)應(yīng)枚舉匹配的constant值,ContactPersonViewModel然后進(jìn)行初始化并且Type屬性被賦值相應(yīng)的類型。我使用PartialView來添加聯(lián)系人和使用ContactPersonViewModel類型的強(qiáng)類型,對(duì)應(yīng)View部分的代碼如下:

    在最上面的代碼我使用了jQueryUI的Datepicker插件作為DateOfBirth輸入框的選擇方式,而DateOfBirth的第二個(gè)參數(shù)保證這個(gè)textbox在初始狀態(tài)下為空。此外,所有的輸入框?qū)ontactPerson的對(duì)應(yīng)屬性名相同,這是為了確保默認(rèn)的modelbinder不出差錯(cuò),MVC還自動(dòng)為ContactType枚舉進(jìn)行綁定。

    負(fù)責(zé)響應(yīng)Post請(qǐng)求的方法可以自動(dòng)將Request.Form的值和ContactPerson對(duì)象的對(duì)應(yīng)屬性進(jìn)行匹配,然后調(diào)用BLL層的Save()方法,然后RedicrectToAction會(huì)讓頁面刷新最后調(diào)用List這個(gè)action。 #p#

    編輯一個(gè)聯(lián)系人

    我們?cè)谇懊嬉呀?jīng)看到j(luò)Query是如何調(diào)用Edit這個(gè)action并把被編輯人的id作為參數(shù)進(jìn)行傳遞的了,然后id用于通過眾所周知的bll調(diào)用DAL從數(shù)據(jù)庫將聯(lián)系人的詳細(xì)信息取出來。

     
     
     
     
    1. <% using (Html.BeginForm("Edit", "Contact", FormMethod.Post)) {%> 
    2.      
    3.         
    4.           Name
    5.           
    6.         
    7.         
    8.           Middle Name
    9.           
    10.         
    11.         
    12.           Last Name
    13.           
    14.         
    15.         
    16.           Date of Birth
    17.           
    18.         
    19.         
    20.           Type
    21.           
    22.         
    23.         
    24.           <%= Html.Hidden("Id") %>
    25.           
    26.         
    27.       
    28. <%= Html.TextBox("FirstName") %>
      <%= Html.TextBox("MiddleName") %>
      <%= Html.TextBox("LastName") %>
      <%= Html.TextBox("DateOfBirth", Model.DateOfBirth.ToString("yyyy/MM/dd")) %>
      <%= Html.DropDownList("Type")%>
    29. <% } %>

    關(guān)鍵不同是DateOfBirth包含一個(gè)將生日信息轉(zhuǎn)換更容易識(shí)別的方式,還有在提交按鈕附近添加了一個(gè)Html.Hidden(),用于保存被編輯用戶的id。當(dāng)然,form的action屬性肯定是和Add的View不同。在Form中可以加一個(gè)參數(shù)用于告訴Action是AddView還是EditView,這樣就能減少代碼的重復(fù),但是在示例代碼中我還是把他們分成了不同的action,來讓職責(zé)劃分的更清晰一些。#p#

    刪除一個(gè)聯(lián)系人

    刪除action就簡(jiǎn)單多了,并且不需要與之相關(guān)的View.僅僅是重新調(diào)用List這個(gè)action,被刪除的數(shù)據(jù)就不復(fù)存在了。上面代碼是我對(duì)BLL和DAL做出改變的地方,原來的ContactPersonManager.Delete()方法的參數(shù)是Person的實(shí)例,而在DAL中,只有id作為參數(shù)。我看不出傳遞整個(gè)對(duì)象給BLL,但BLL卻只傳遞對(duì)象的唯一ID給DAL的意義所在,所以我將BLL的代碼改成接受int類型的參數(shù),這樣寫起來會(huì)更簡(jiǎn)單。當(dāng)刪除鏈接被點(diǎn)擊時(shí),調(diào)用jQuery的confirmationmodaldialog:

    如果點(diǎn)擊取消,則什么事也不發(fā)生,如果點(diǎn)擊確認(rèn),則鏈接就會(huì)指向響應(yīng)的deleteaction。

    管理集合

    所有的集合--PhoneNumberList,EmailAddressLIst,AddressList被管理的方式如出一轍。所以,我僅僅挑選EmailAddressLIst作為示例來說明方法,你可以下載示例代碼來看其他部分。上面方法使用聯(lián)系人的id作為聯(lián)系人,并且返回一個(gè)自定義ViewModel—EmailAddressListViewModel.這也是將聯(lián)系人的id傳到View的方法:

     
     
     
     
    1.    
    2.      Contact Person Id
    3.      Email
    4.      Type
    5.       
    6.       
    7.    
    8.    <%if(Model.EmailAddresses != null)
    9.      {foreach (var email in Model.EmailAddresses) {%>
    10.    
    11.      <%= email.Id %>
    12.      <%= email.Email %>
    13.      <%= email.Type %>
    14.      Edit
    15.      Delete
    16.    
    17.         <%}
    18.     }else
    19.  {%>
    20.    
    21.      No email addresses for this contact
    22.    
    23.  <%}%>

    你可以看出添加方法需要ContactPersonID作為參數(shù),我們需要確??梢蕴砑有碌穆?lián)系人到響應(yīng)的聯(lián)系人列表。編輯和刪除方法也是如此--id參數(shù)通過url傳遞到相關(guān)action.而所有的單元格都有title屬性,這樣就可以使用前面部署的live()方法:

     
     
     
     
    1. [AcceptVerbs(HttpVerbs.Get)]
    2. public ActionResult Add(int id)
    3. {
    4.   var contactTypes = Enum.GetValues(typeof(ContactType))
    5.     .Cast()
    6.     .Select(c => new
    7.     {
    8.       Id = c,
    9.       Name = c.ToString()
    10.     });
    11.   var model = new EmailAddressViewModel
    12.                 {
    13.                   ContactPersonId = id,
    14.                   Type = new SelectList(contactTypes, "ID", "Name")
    15.                 };
    16.   return PartialView("Add", model);
    17. }
    18. [AcceptVerbs(HttpVerbs.Post)]
    19. public ActionResult Add(EmailAddress emailAddress)
    20. {
    21.   emailAddress.Id = -1;
    22.   EmailAddressManager.Save(emailAddress);
    23.   return RedirectToAction("List", new {id = emailAddress.ContactPersonId});
    24. }

    創(chuàng)建自定義ViewModel存在的目的是為了對(duì)現(xiàn)有的EmailAddress進(jìn)行添加或編輯,這包括一些綁定IEnumerable集合到Typedropdown的屬性,上面兩個(gè)Add不同之處在于他們的返回不同,第一個(gè)返回partialview,第二個(gè)返回List這個(gè)action。

    集合中的每一個(gè)選在在一開始都會(huì)將id設(shè)為-1,這是為了保證符合”Upsert”存儲(chǔ)過程的要求,因?yàn)镮mar對(duì)于添加和刪除使用的是同一個(gè)存儲(chǔ)過程,如果不設(shè)置成-1,則當(dāng)前新建的聯(lián)系人會(huì)更新掉數(shù)據(jù)庫中的聯(lián)系人。

    上面jQuery代碼負(fù)責(zé)通過Ajax提交form.jQuery給htmlbutton(而不是inputtype=”submit”)附加事件,然后將頁面中的內(nèi)容序列化并通過post請(qǐng)求發(fā)送到使用合適AcceptVerbs標(biāo)簽修飾的名為add()的action。 #p#

    編輯和刪除EmailAddress對(duì)象

    編輯EmailAddress對(duì)象所涉及的action和前面提到的很相似,仍然是兩個(gè)action,一個(gè)用于處理get請(qǐng)求,另一個(gè)用于處理post請(qǐng)求:

     
     
     
     
    1. AcceptVerbs(HttpVerbs.Get)]
    2. public ActionResult Edit(int id)
    3. {
    4.   var emailAddress = EmailAddressManager.GetItem(id);
    5.   var contactTypes = Enum.GetValues(typeof(ContactType))
    6.     .Cast()
    7.     .Select(c => new
    8.     {
    9.       Id = c,
    10.       Name = c.ToString()
    11.     });
    12.   var model = new EmailAddressViewModel
    13.   {
    14.     Type = new SelectList(contactTypes, "ID", "Name", emailAddress.Type),
    15.     Email = emailAddress.Email,
    16.     ContactPersonId = emailAddress.ContactPersonId,
    17.     Id = emailAddress.Id
    18.   };
    19.   return View(model);
    20. }
    21. [AcceptVerbs(HttpVerbs.Post)]
    22. public ActionResult Edit(EmailAddress emailAddress)
    23. {
    24.   EmailAddressManager.Save(emailAddress);
    25.   return RedirectToAction("List", "Email", new { id = emailAddress.ContactPersonId });
    26. }

    下面的partialView代碼現(xiàn)在應(yīng)該很熟悉了吧:

     
     
     
     
    1. <% using(Html.BeginForm("Edit", "Email", FormMethod.Post, new { id = "EditEmail" })) {%>
    2.   Email:
    3.   <%= Html.TextBox("Email")%>
    4.   Type:
    5.   <%= Html.DropDownList("Type") %>
    6.   <%= Html.Hidden("ContactPersonId") %><%= Html.Hidden("Id") %>
    7.   

    上面代碼仍然和AddView很像,除了包含EmailAddress.Id的html隱藏域,這是為了保證正確的email地址被更新,而Deleteaction就不用過多解釋了吧。

     
     
     
     
    1. public ActionResult Delete(int id)
    2. {
    3.   EmailAddressManager.Delete(id);
    4.   return RedirectToAction("List", "Contact");
    5. }

    總結(jié)

    這篇練習(xí)的目的是為了證明ASP.NET MVC在沒有Linq To SQL和Entity framework的情況下依然可以很完美的使用。文章使用了現(xiàn)有分層結(jié)構(gòu)良好的ASP.NET 2.0 form程序,還有可重用的businessObjects層,bussinesslogic層以及DataAccess層。而DAL層使用ADO.NET調(diào)用SQL Server的存儲(chǔ)過程來實(shí)現(xiàn)。

    同時(shí)也展示了如何使用強(qiáng)類型的ViewModels和簡(jiǎn)潔的jQuery來讓UI體驗(yàn)更上一層。這個(gè)程序并不是完美的,也不是用于真實(shí)世界。程序中View部分,以及混合編輯和刪除的action都還有很大的空間可以重構(gòu)提升,程序還缺少驗(yàn)證用戶輸入的手段,所有的刪除操作都會(huì)返回頁面本身。而更好的情況應(yīng)該是顯示刪除后用一個(gè)子表來顯示刪除后的內(nèi)容,這需要將ContactPersonId作為參數(shù)傳遞到相關(guān)Action,這也是很好實(shí)現(xiàn)的。


    當(dāng)前標(biāo)題:ASP.NETMVC并不僅僅只是LINQToSQL
    標(biāo)題來源:http://m.5511xx.com/article/dhegpdp.html