Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÔÚÒ»¸ö¿ÕASP.NET WebÏîÄ¿ÉÏ´´½¨Ò»¸öASP.NET Web API 2.0Ó¦ÓÃ
 
  5214  次浏览      27
 2018-5-9 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcnblogs£¬Ö÷Òª½éÉÜÁ˽â¾ö·½°¸£¬¶ÔwebAPI µÄ¶¨Ò壬·Ö±ðÒÔÒÔWeb HostºÍSelf HostµÄ·½Ê½¼ÄËÞWeb API £¬ÀûÓÃHttpClientµ÷ÓÃWeb API £¬´´½¨Ò»¸ö¡°ÁªÏµÈ˹ÜÀíÆ÷¡±Ó¦Óõȡ£

ÓÉÓÚASP.NET Web API¾ßÓÐÓëASP.NET MVCÀàËÆµÄ±à³Ì·½Ê½£¬ÔÙ¼ÓÉÏĿǰÊÐÃæÉÏרÃŽéÉÜASP.NET Web API µÄÊé¼®ÉÙÖ®ÓÖÉÙ£¨ÎÒÃÇ¿´µ½µÄÏà¹ØÄÚÈÝÍùÍùÊÇij±¾½éÉÜASP.NET MVCµÄÊé¼®¡°¶îÍâ·îËÍ¡±µÄ£©£¬ÒÔÖÁÓںܶàÈË»á¾õµÃASP.NET Web API½ö½öÊÇASP.NET MVCµÄÒ»¸öССµÄÀ©Õ¹¶øÒÑ£¬×ÔÉí²¢Ã»ÓÐÌ«¶à¡°´óÊéÌØÊ顱µÄµØ·½¡£¶øÕæÊµµÄÇé¿öÏÂÊÇ£ºASP.NET Web API²»½ö½ö¾ßÓÐÒ»¸öÍêÈ«¶ÀÁ¢µÄÏûÏ¢´¦Àí¹ÜµÀ£¬¶øÇÒÕâ¸ö¹ÜµÀ±ÈΪASP.NET MVCÉè¼ÆµÄ¹ÜµÀ¸üΪ¸´ÔÓ£¬¹¦ÄÜÒ²¸üΪǿ´ó¡£ËäÈ»±»ÃüÃûΪ¡°ASP.NET Web API¡±£¬µ«ÊÇÕâ¸öÏûÏ¢´¦Àí¹ÜµÀÈ´ÊǶÀÁ¢ÓÚASP.NETƽ̨µÄ£¬ÕâÒ²ÊÇΪʲôASP.NET Web APIÖ§³Ö¶àÖÖ¼ÄËÞ·½Ê½µÄ¸ùÔ´ËùÔÚ¡£[±¾ÎÄÒѾ­Í¬²½µ½¡¶How ASP.NET Web API Works?¡·]

ΪÁËÈöÁÕßÅóÓÑÃÇÏȶÔASP.NET Web API¾ßÓÐÒ»¸ö¸ÐÐÔÈÏʶ£¬½ÓÏÂÀ´ÎÒÃÇÒÔʵÀýÑÝʾµÄÐÎʽ´´½¨Ò»¸ö¼òµ¥µÄASP.NET Web APIÓ¦Óá£ÕâÊÇÒ»¸öÓÃÓÚʵÏÖ¡°ÁªÏµÈ˹ÜÀí¡±µÄµ¥Ò³WebÓ¦Óã¬ÎÒÃÇÒÔAjaxµÄÐÎʽµ÷ÓÃWeb APIʵÏÖÕë¶ÔÁªÏµÈ˵ÄCRUD²Ù×÷¡£[Ô´´úÂë´ÓÕâÀïÏÂÔØ]

Ò»¡¢¹¹½¨½â¾ö·½°¸

Visual StudioΪÎÒÃÇÌṩÁËרÃÅÓÃÓÚ´´½¨ASP.NET Web APIÓ¦ÓõÄÏîĿģ°å£¬½èÖúÓÚ´ËÏîĿģ°åÌṩµÄÏòµ¼£¬ÎÒÃÇ¿ÉÒÔ¡°Ò»¼üʽ¡±´´½¨Ò»¸öÍêÕûµÄASP.NET Web APIÏîÄ¿¡£ÔÚÏîÄ¿´´½¨¹ý³ÌÖУ¬Visual Studio»á×Ô¶¯ÎªÎÒÃÇÌí¼Ó±ØÒªµÄ³ÌÐò¼¯ÒýÓúÍÅäÖã¬ÉõÖÁ»áΪÎÒÃÇ×Ô¶¯Éú³ÉÏà¹ØµÄ´úÂ룬×ÜÖ®Ò»¾ä»°£ºÕâÖÖͨ¹ýÏòµ¼Éú³ÉµÄÏîÄ¿ÔÚ±»´´½¨Ö®ºóÆä±¾Éí¾ÍÊÇÒ»¸ö¿ÉÖ´ÐеÄÓ¦Óá£

¶ÔÓÚIDEÌṩµÄÕâÖÖÖ¼ÔÚÌá¸ßÉú²úЧÂʵÄ×Ô¶¯»¯»úÖÆ£¬ÎÒ¸öÈË×ÔÈ»ÊÇÍÆ³çµÄ£¬µ«ÊÇÎÒ¸üÍÆ¼ö¶ÁÕßÅóÓÑÃÇÈ¥Á˽âÒ»ÏÂÕâЩ×Ô¶¯»¯»úÖÆ¾ßÌåΪÎÒÃÇ×öÁËʲô£¿×öÕâЩµÄÄ¿µÄºÎÔÚ£¿ÄÄЩÊDZØÐèµÄ£¬ÄÄЩÓÖÊDz»±ØÒªµÄ£¿ÕýÊÇ»ùÓÚÕâÑùµÄÄ¿µÄ£¬ÔÚ½ÓÏÂÀ´ÑÝʾµÄʵÀýÖУ¬ÎÒÃǽ«ÞðÆúVisual StudioΪÎÒÃÇÌṩµÄÏòµ¼£¬ÍêÈ«ÔÚ´´½¨µÄ¿ÕÏîÄ¿ÖбàдÎÒÃǵijÌÐò¡£ÕâЩ¿ÕÏîÄ¿ÌåÏÖÔÚÈçÓÒͼËùʾµÄ½â¾ö·½°¸½á¹¹ÖС£

ÈçÏÂͼËùʾ£¬Õû¸ö½â¾ö·½°¸Ò»¹²°üº¬6¸öÏîÄ¿£¬ÉÏÃæ½éÉܵÄ×÷Ϊ¡°ÁªÏµÈ˹ÜÀíÆ÷¡±µÄµ¥Ò³WebÓ¦ÓöÔÓ¦×ÅÏîÄ¿WebApp£¬ÏÂÃæµÄÁÐ±í¸ø³öÁ˰üÀ¨ËüÔÚÄÚµÄËùÓÐÏîÄ¿µÄÀàÐͺͰçÑݵĽÇÉ«¡£

¡¤Common£ºÕâÊÇÒ»¸ö¿ÕµÄÀà¿âÏîÄ¿£¬½ö½ö¶¨ÒåÁ˱íʾÁªÏµÈ˵ÄÊý¾ÝÀàÐͶøÒÑ¡£Ö®ËùÒÔ½«Êý¾ÝÀàÐͶ¨ÒåÔÚ¶ÀÁ¢µÄÏîÄ¿ÖУ¬Ö»ÒªÊÇ¿¼Âǵ½Ëü»á±»¶à¸öÏîÄ¿£¨WebApiºÍConsoleApp£©ËùʹÓá£

WebApi£ºÕâÊÇÒ»¸ö¿ÕµÄÀà¿âÏîÄ¿£¬±íÏÖΪHttpControllerÀàÐ͵ÄWeb API¾Í¶¨ÒåÔÚ´ËÏîÄ¿ÖУ¬Ëü¾ßÓжÔCommonµÄÏîÄ¿ÒýÓá£

WebHost£ºÕâÊÇÒ»¸ö¿ÕµÄASP.NET WebÓ¦Óã¬ËüʵÏÖÁËÕë¶ÔASP.NET Web APIµÄWeb Host¼ÄËÞ£¬¸ÃÏîÄ¿¾ßÓÐÕë¶ÔWebApiµÄÏîÄ¿ÒýÓá£

SelfHost£ºÕâÊÇÒ»¸ö¿ÕµÄ¿ØÖÆÌ¨Ó¦Óã¬Ö¼ÔÚÄ£ÄâASP.NET Web APIµÄSelf Host¼ÄËÞģʽ£¬ËüͬÑù¾ßÓÐÕë¶ÔWebApiµÄÏîÄ¿ÒýÓá£

WebApp£ºÕâÊÇÒ»¸ö¿ÕµÄASP.NET WebÓ¦Ó㬴ú±í¡°ÁªÏµÈ˹ÜÀíÆ÷¡±µÄÍøÒ³¾Í´æÔÚÓÚ¸ÃÏîĿ֮ÖУ¬ÖÁÓÚ¾ßÌåµÄÁªÏµÈ˹ÜÀí¹¦ÄÜ£¬×ÔȻͨ¹ýÒÔAjaxµÄÐÎʽµ÷ÓÃWeb APIÀ´Íê³É¡£

ConsoleApp£ºÕâÊÇÒ»¸ö¿ÕµÄ¿ØÖÆÌ¨Ó¦Óã¬ÎÒÃÇÓÃËüÀ´Ä£ÄâÈçºÎÀûÓÿͻ§¶Ë´úÀíÀ´ÊµÏÖ¶ÔWeb APIµÄÔ¶³Ìµ÷Óã¬Ëü¾ßÓÐÕë¶ÔCommonµÄÏîÄ¿ÒýÓá£

¶þ¡¢¶¨ÒåWeb API

ÔÚÕýʽ¶¨ÒåWeb API֮ǰ£¬ÎÒÃÇÐèÒªÔÚÏîÄ¿CommonÖж¨Òå´ú±íÁªÏµÈ˵ÄÊý¾ÝÀàÐÍContact¡£¼òµ¥Æð¼û£¬ÎÒÃǽö½öΪContact¶¨ÒåÁËÈçϼ¸¸ö¼òµ¥µÄÊôÐÔ£¬ËüÃÇ·Ö±ð´ú±íÁªÏµÈ˵ÄID¡¢ÐÕÃû¡¢ÁªÏµµç»°¡¢µç×ÓÓÊÏäºÍÁªÏµµØÖ·¡£

1: public class Contact
2: {
3: public string Id { get; set; }
4: public string Name { get; set; }
5: public string PhoneNo { get; set; }
6: public string EmailAddress { get; set; }
7: public string Address { get; set; }
8: }

±íÏÖΪHttpControllerµÄWeb API¶¨ÒåÔÚWebApiÏîĿ֮ÖУ¬ÎÒÃÇÒ»°ã½«ApiController×÷Ϊ¼Ì³ÐµÄ»ùÀà¡£ApiController¶¨ÒåÔÚ¡°System.Web.Http.dll¡±³ÌÐò¼¯ÖУ¬ÎÒÃÇ¿ÉÒÔÔÚĿ¼¡°%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\¡±ÖÐÕÒµ½Õâ¸ö³ÌÐò¼¯¡£¾ßÌåÀ´Ëµ£¬¸Ã³ÌÐò¼¯´æÔÚÓÚ×ÓĿ¼¡°Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45¡±ÖС£

Web APIÌåÏÖÔÚÈçÏÂËùʾµÄContactsControllerÀàÐÍÖС£ÔÚ¸ÃÀàÐÍÖУ¬ÎÒÃǶ¨ÒåÁËGet¡¢Post¡¢PutºÍDeleteÕâ4¸öAction·½·¨£¬ËüÃÇ·Ö±ðʵÏÖÁËÕë¶ÔÁªÏµÈ˵IJéѯ¡¢Ìí¼Ó¡¢Ð޸ĺÍɾ³ý²Ù×÷¡£Action·½·¨Get¾ßÓÐÒ»¸ö±íʾÁªÏµÈËIDµÄ¿Éȱʡ²ÎÊý£¬Èç¹û¸Ã²ÎÊý´æÔÚÔò·µ»Ø¶ÔÓ¦µÄÁªÏµÈË£¬·ñÔò·µ»ØÕû¸öÁªÏµÈËÁÐ±í¡£ÓÉÓÚASP.NET Web APIĬÈÏʵÏÖÁËAction·½·¨ÓëHTTP·½·¨µÄÓ³É䣬ËùÒÔ·½·¨ÃûÒ²ÌåÏÖÁËËüÃǸ÷×ÔËùÄÜ´¦ÀíÇëÇó±ØÐë²ÉÓõÄHTTP·½·¨¡£

1: public class ContactsController: ApiController
2: {
3: static List<Contact> contacts;
4: static int counter = 2;
5:
6: static ContactsController()
7: {
8: contacts = new List<Contact>();
9: contacts.Add (new Contact { Id = "001", Name = "ÕÅÈý",
10: PhoneNo = "0512-12345678", EmailAddress = " zhangsan@gmail.com",
11: Address = "½­ËÕÊ¡ËÕÖÝÊÐÐǺþ½Ö328ºÅ" });
12: contacts.Add(new Contact { Id = "002", Name = "ÀîËÄ",
13: PhoneNo = " 0512-23456789", EmailAddress = "lisi@gmail.com",
14: Address = "½­ËÕÊ¡ËÕÖÝÊн𼦺þ´óµÀ328ºÅ" });
15: }
16:
17: public IEnumerable< Contact> Get(string id = null)
18: {
19: return from contact in contacts
20: where contact.Id == id || string.IsNullOrEmpty(id)
21: select contact;
22: }
23:
24: public void Post(Contact contact)
25: {
26: Interlocked.Increment (ref counter);
27: contact.Id = counter.ToString ("D3");
28: contacts.Add(contact);
29: }
30:
31: public void Put (Contact contact)
32: {
33: contacts.Remove (contacts.First(c => c.Id == contact.Id));
34: contacts.Add(contact);
35: }
36:
37: public void Delete (string id)
38: {
39: contacts.Remove (contacts.First(c => c.Id == id));
40: }
41: }

¼òµ¥Æð¼û£¬ÎÒÃÇÀûÓÃÒ»¸ö¾²Ì¬×ֶΣ¨contacts£©±íʾ´æ´¢µÄÁªÏµÈËÁÐ±í¡£µ±ContactsControllerÀàÐͱ»¼ÓÔØµÄʱºò£¬ÎÒÃÇÌí¼ÓÁËÁ½¸öID·Ö±ðΪ¡°001¡±ºÍ¡°002¡±µÄÁªÏµÈ˼Ǽ¡£ÖÁÓÚʵÏÖÁªÏµÈËCRUD²Ù×÷µÄAction·½·¨£¬ÎÒÃÇҲʡÂÔÁ˱ØÒªµÄÑéÖ¤£¬¶ÔÓÚ±¾ÊéºóÐøµÄÑÝʾµÄʵÀý£¬ÎÒÃÇ»ù±¾ÉÏÒ²»á²ÉÓÃÕâÖÖ¡°¼òд¡±µÄ·ç¸ñ¡£

Èý¡¢ÒÔWeb Host·½Ê½¼ÄËÞWeb API

ÎÒÃÇÔÚÉÏÃæÒѾ­Ìáµ½¹ýÁË£¬ËäÈ»±»ÃüÃûΪASP.NET Web API£¬µ«ÊÇÆäºËÐĵÄÏûÏ¢´¦Àí¹ÜµÀÈ´ÊǶÀÁ¢ÓÚASP.NETƽ̨µÄ£¬ËùÒÔÎÒÃÇ¿ÉÒÔ¶ÔÏàͬµÄWeb APIʵʩ²»Í¬µÄ¼ÄËÞ·½Ê½¡£¼ÄË޵ı¾ÖʾÍÊÇÀûÓÃÒ»¸ö¾ßÌåµÄÓ¦ÓóÌÐòΪWeb APIÌṩһ¸öÔËÐеĻ·¾³£¬²¢×îÖÕ½â¾ö¡°ÇëÇóµÄ½ÓÊÕºÍÏìÓ¦µÄ»Ø¸´¡±ÎÊÌâ¡£×÷Ϊ¼ÄËÞµÄÒ»ÖÖÖ÷ÒªÐÎʽ£¬Web Host¾ÍÊÇ´´½¨Ò»¸öASP.NET WebÓ¦ÓÃ×÷ΪWeb APIµÄËÞÖ÷¡£

²ÉÓÃWeb Host·½Ê½¼ÄËÞWeb APIµÄËÞÖ÷³ÌÐòWebHostÊÇÒ»¸ö¿ÕµÄASP.NETÓ¦ÓᣳýÁËÈÃËüÒýÓö¨ÒåContactsControllerµÄWebApiÏîĿ֮Í⣬ÎÒÃÇ»¹ÐèҪΪÆäÌí¼ÓÈçÏÂÕâЩ±ØÐèµÄ³ÌÐò¼¯ÒýÓᣳýÁ˳ÌÐò¼¯¡°System.Net.Http.dll¡±£¨ËüÊôÓÚ.NET Framework Ô­ÉúµÄ³ÌÐò¼¯£©Ö®Í⣬ÆäÓà3¸ö¾ù¿ÉÒÔÔÚĿ¼¡°%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\¡±ÖÐÕÒµ½¡£

System.Web.Http.dll £¨\ Microsoft.AspNet. WebApi.Core.5.0.0 \lib\net45\£©

System.Net.Formatting.Http.dll £¨\Microsoft.AspNet. WebApi.Client.5.0.0\lib\net45\£©

System.Web.Http.WebHost.dll £¨\Microsoft.AspNet. WebApi.WebHost.5.0.0\lib\net45\£©

System.Net.Http.dll

ÓëASP.NET MVCÒ»Ñù£¬Èç¹û²ÉÓÃWeb HostµÄ·½Ê½À´¼ÄËÞWeb API£¬ASP.NET×ÔÉíµÄ·ÓÉϵͳ»á³ÉΪ½ÓÊÕÇëÇóµÄµÚÒ»µÀÆÁÕÏ¡£ÔÚ½«ÇëÇóµÝ½»¸øASP.NET Web API×Ô¼ºµÄÏûÏ¢´¦Àí¹ÜµÀ֮ǰ£¬Â·ÓÉϵͳ»á½âÎö³öµ±Ç°ÇëÇó·ÃÎʵÄÄ¿±êHttpControllerºÍActionµÄÃû³Æ¡£ÎÒÃÇÐèÒª×öµÄ¾ÍÊǸù¾ÝÐèÇó×¢²áÏàÓ¦µÄ·ÓÉ£¬ÕâÒ²ÊDzÉÓÃWeb Host¼ÄËÞ·½Ê½ËùÐèµÄΨһ²Ù×÷¡£

ÎÒÃÇÔÚWebHostÏîÄ¿ÖÐÌí¼ÓÒ»¸öGlobal.asaxÎļþ£¬²¢°´ÕÕÈçϵÄÐÎʽÔÚÆäApplication_Start·½·¨ÖÐ×¢²áÁËÒ»¸öÄ£°åΪ¡°api/{controller}/{id}¡±µÄ·ÓÉ¡£´ËÄ£°åÓÉ3²¿·Ö×é³É£¬¾²Ì¬Îı¾¡°api¡±±íʾÆäǰ׺£¬ºóÃæÊÇÁ½¸ö·ÓɲÎÊý¡£Ç°Õߣ¨{controller}£©±íʾĿ±êHttpControllerµÄÃû³Æ£¬ºóÕߣ¨{id}£©¿ÉÒÔÓ³ÉäΪĿ±êAction·½·¨µÄͬÃû²ÎÊý£¨±ÈÈçContractsControllerµÄGet·½·¨µÄ²ÎÊýid£©£¬ÕâÊÇÒ»¸ö¿ÉÒÔȱʡµÄ·ÓɲÎÊý£¨RouteParameter.Optional£©¡£

1: public class Global : System.Web.HttpApplication
2: {
3: protected void Application_Start (object sender, EventArgs e)
4: {
5: GlobalConfiguration .Configuration.Routes.MapHttpRoute(
6: Name : " DefaultApi",
7: routeTemplate : "api/{controller}/{id}",
8: defaults : new { id = RouteParameter.Optional });
9: }
10: }

ÈçÉÏÃæµÄ´úÂëÆ¬¶ÏËùʾ£¬Â·ÓÉ×¢²áÊÇͨ¹ýµ÷Óôú±íÈ«¾Ö·ÓɱíµÄHttpRouteCollection¶ÔÏóµÄÀ©Õ¹·½·¨MapHttpRouteÀ´Íê³ÉµÄ¡£GlobalConfigurationµÄ¾²Ì¬ÊôÐÔConfiguration·µ»ØÒ»¸ö´ú±íµ±Ç°ÅäÖõÄHttpConfiguration¶ÔÏó£¬È«¾Ö·Óɱí¾Í×¢²áÔÚËüµÄRoutesÊôÐÔÉÏ¡£

Èç¹ûÄãÁ˽âASP.NET MVCµÄ·ÓÉ×¢²á£¬¿ÉÄܾõµÃÆæ¹Ö£º×¢²á·ÓɵÄÄ£°åÖв¢Ã»ÓбíʾĿ±êActionµÄ·ÓɲÎÊý£¬ASP .NET Web APIÈçºÎ¸ù¾ÝÇëÇóÈ·¶¨ÄĸöAction·½·¨Ó¦¸Ã±»µ÷ÓÃÄØ£¿´ð°¸ÆäʵºÜ¼òµ¥£ºËüÄܸù¾ÝÇëÇó²ÉÓÃHTTP·½·¨À´È·¶¨Ä¿±êAction·½·¨¡£µ±È»£¬ÔÚ×¢²á·ÓÉÄ£°åÖÐÌṩ´ú±íActionÃû³ÆµÄ·ÓɲÎÊý£¨{action}£©Ò²ÊÇÖ§³ÖµÄ¡£

ÔÚĬÈÏÇé¿öÏ£¬Í¨¹ýVisual Studio£¨VS 2012»òÕßVS 2013£¬±¾Êé²ÉÓõÄÊǺóÕߣ©´´½¨µÄWebÓ¦ÓÃ×ÜÊÇʹÓÃIIS Express×÷Ϊ·þÎñÆ÷£¬Ëü»á×Ô¶¯ÎªÎÒÃÇÖ¸¶¨Ò»¸ö¿ÉÓõĶ˿ںš£ÎªÁ˸üºÃµØÄ£ÄâÕæÊµ·¢²¼»·¾³£¬Í¬Ê±±ÜÃâ¡°¿çÓò×ÊÔ´¹²Ïí¡±´øÀ´µÄÀ§ÈÅ£¬ÎÒÃDzÉÓñ¾µØIIS×÷Ϊ·þÎñÆ÷¡£ÈçÏÂͼËùʾ£¬WebHostÏîÄ¿ÔÚIISÖÐÓ³ÉäµÄWebÓ¦ÓòÉÓõÄURLΪ¡°http://localhost/webhost¡±¡£

ʵ¼ÊÉϵ½´ËΪֹ£¬Web APIµÄWeb Host¼ÄËÞ¹¤×÷¾ÍÒѾ­Íê³É£¬ÎÒÃÇ¿ÉÒÔÀûÓÃä¯ÀÀÆ÷À´µ÷ÓüÄËÞµÄWeb APIÀ´ÅжϼÄËÞ¹¤×÷ÊÇ·ñ³É¹¦¡£ÓÉÓÚä¯ÀÀÆ÷ÔÚĬÈÏÇé¿öÏ·ÃÎÊÎÒÃÇÔÚµØÖ·À¸ÖÐÊäÈëµÄµØÖ·×ÜÊDzÉÓÃHTTP-GETÇëÇó£¬ËùÒÔÎÒÃÇÖ»ÄÜÀûÓÃËüÀ´µ÷ÓÃÖ§³ÖHTTP-GETµÄAction·½·¨£¬¼´¶¨ÒåÔÚContactsControllerÖеÄGet·½·¨¡£

¸ù¾ÝÎÒÃÇ×¢²áµÄ·ÓÉ£¬Èç¹ûÎÒÃÇ·ÃÎÊÄ¿±êµØÖ·¡°http://localhost/webhost/api/contacts¡±¿ÉÒÔ»ñµÃËùÓÐÁªÏµÈËÁÐ±í£»Èç¹ûÄ¿±êµØÖ·Îª¡°http://localhost/webhost/api/contacts/001¡±£¬Ôò¿ÉÒԵõ½IDΪ¡°001¡±µÄÁªÏµÈËÐÅÏ¢£¬ÏÂͼ֤ʵÁËÕâÒ»µã¡£

´ÓÏÂͼ¿ÉÒÔ¿´µ½£¬ÎÒÃDzÉÓõÄä¯ÀÀÆ÷ΪChrome£¬»ñÈ¡µÄÁªÏµÈËÁбí×ÜÊDZíʾΪXML£¬ÕâÊÇÎªÊ²Ã´ÄØ£¿ÔÚÇ°Ãæ½éÉÜRESTµÄʱºò£¬ÎÒÃÇÔø¾­Ìá¼°Ò»ÖÖÖ¼ÔÚʶ±ð¿Í»§¶ËÆÚÍûµÄ×ÊÔ´±íʾÐÎʽ²¢±»³ÆÎª¡°ÄÚÈÝЭÉÌ¡±µÄ»úÖÆ£¬Ëü¿ÉÒÔ¸ù¾ÝÇëÇóЯ´øµÄÏà¹ØÐÅÏ¢À´ÅжϿͻ§¶ËËùÆÚÍûµÄÏìÓ¦×ÊÔ´±íÏÖÐÎʽ¡£

¶ÔÓÚASP.NET Web APIÀ´Ëµ£¬Ëü»áÓÅÏÈÀûÓÃÇëÇó±¨Í·¡°Accept¡±Ð¯´øµÄýÌåÀàÐÍÀ´È·¶¨ÏìÓ¦ÄÚÈݲÉÓõıíÏÖÐÎʽ¡£ÈçÏÂËùʾµÄÊÇChrome·ÃÎÊ¡°http://localhost/webhost/api/contacts/001¡±·¢ËÍÇëÇóµÄÄÚÈÝ£¬ËüÖ®ËùÒÔ»áµÃµ½ÒÔXML±íʾµÄÏìÓ¦ÊÇÒòΪ¡°Accept¡±±¨Í·Ö¸¶¨µÄýÌåÀàÐÍÁбíÖÐÖ»ÓС°application/xml¡±±»ASP.NET Web APIÖ§³Ö¡£Èç¹ûÎÒÃDzÉÓÃIE£¬ÇëÇóµÄ¡°Accept¡±±¨Í·½«Ð¯´ø²»Í¬µÄýÌåÀàÐÍÁÐ±í£¬ÎÒÃÇʵ¼ÊÉÏ»áµÃµ½ÒÔJSON¸ñʽ±íʾµÄÏìÓ¦½á¹û¡£

1: GET http://localhost/webhost /api/contacts/001 HTTP/1.1
2: Host: localhost
3: Connection: keep-alive
4: Cache-Control: max-age=0
5: Accept: text/html,application /xhtml+xml,application/xml ;q=0.9,image/webp,*/*;q=0.8
6: User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
7: Accept-Encoding: gzip,deflate,sdch
8: Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh-TW;q=0.4

ΪÁ˽øÒ»²½ÑéÖ¤²¢ÑÝʾASP.NET Web APIµÄÄÚÈÝЭÉÌ»úÖÆ£¬ÎÒÃÇÏÖÔÚ¸ÄÓÃFiddlerÀ´·¢Ë͵÷ÓÃWeb APIµÄHTTPÇëÇó¡£ÈçÏÂͼËùʾ£¬ÎÒÃÇÀûÓÃFiddler·¢ËÍÁËÒ»¸öÕë¶ÔÄ¿±êµØÖ·¡°http://localhost/webhost/api/contacts/001¡±µÄHTTP-GETÇëÇ󣬲¢Ìí¼ÓÁËÒ»¸öֵΪ¡°application/json¡±µÄ¡°Accept¡±±¨Í·£¬ÇëÇó·¢ËÍÖ®ºóȷʵµÃµ½ÁËÒÔJSON¸ñʽ±íʾµÄÁªÏµÈËÁÐ±í¡£

Ö§³ÖPUTºÍDELETEÇëÇó

ÔÚ¶¨ÒåContactsControllerµÄʱºò£¬ÎÒÃÇÑϸñ°´ÕÕRESTful Web API¹ØÓÚ¡°Ê¹Óñê×¼µÄHTTP·½·¨¡±µÄÖ¸µ¼·½Õ룬·Ö±ð²ÉÓÃGET¡¢POST¡¢PUTºÍDELETE×÷Ϊ»ñÈ¡¡¢´´½¨¡¢Ð޸ĺÍɾ³ýÁªÏµÈ˵IJÙ×÷ËùÖ§³ÖµÄHTTP·½·¨¡£µ«ÊÇIISÔÚĬÈÏÇé¿öϲ¢²»ÌṩÕë¶Ô PUTºÍDELETEÇëÇóµÄÖ§³Ö¡£

ÈçÏÂͼËùʾ£¬ÎÒÃÇÀûÓÃFiddler·¢ËÍÁËÒ»¸öÕë¶ÔµØÖ·¡°http://localhost/webhost/api/contacts/001¡±µÄHTTP-DELETEÇëÇó£¬Ö¼ÔÚɾ³ýIDΪ¡°001¡±µÄÁªÏµÈË¡£µ«ÊÇÒź¶µÄÊÇ£¬ÎÒÃǵõ½ÁËÒ»¸ö״̬Ϊ¡°405£¬Method Not Allowed¡±µÄÏìÓ¦£¬Òâζ×Å·þÎñ¶Ë²¢²»Ö§³ÖHTTP-DELETE·½·¨¡£

IIS¾Ü¾øPUTºÍDELETEÇëÇóÊÇÓÉĬÈÏ×¢²áµÄÒ»¸öÃûΪ¡°WebDAVModule¡±µÄ×Ô¶¨ÒåHttpModuleµ¼Öµġ£WebDAVµÄÈ«³ÆÎª¡°Web-based Distributed Authoring and Versioning¡±£¬ËüÊÇÒ»¸öÔÚ¶àÓû§Ö®¼ä¸¨ÖúЭͬ±à¼­ºÍ¹ÜÀíÔÚÏßÎĵµµÄHTTPÀ©Õ¹¡£¸ÃÀ©Õ¹Ê¹Ó¦ÓóÌÐò¿ÉÒÔÖ±½Ó½«Îļþдµ½ Web Server ÉÏ£¬Í¬Ê±Ö§³ÖÎļþµÄ¼ÓËøºÍ°æ±¾¿ØÖÆ¡£

΢ÈíÊÇÍÆ¶¯WebDAV³ÉΪһ¸ö±ê×¼µÄÖ÷µ¼Á¦Á¿£¬Ëü×Ô¼ºÀûÓÃ×Ô¶¨ÒåµÄHttpModuleʵÏÖÁËIISÕë¶ÔWebDAVµÄÖ§³Ö¡£µ«ÊÇÕâ¸öĬÈÏ×¢²á£¨×¢²áÃû³ÆÎª¡°WebDAVModule¡±£©»á¾Ü¾øHTTP·½·¨ÎªPUTºÍDELETEµÄÇëÇó£¬Èç¹ûÎÒÃǵÄÕ¾µã²»ÐèÒªÌṩÕë¶ÔWebDAVµÄÖ§³Ö£¬½â¾öÕâ¸öÎÊÌâ×îΪֱ½ÓµÄ·½Ê½¾ÍÊÇÀûÓÃÈçϵÄÅäÖý«×¢²áµÄHttpModuleÒÆ³ý¡£

1: <configuration>
2: ...
3: <system.webServer>
4: <modules runAllManagedModulesForAllRequests="true">
5: <remove name="WebDAVModule" />
6: </modules>
7: </system.webServer>
8: </configuration>

ËÄ¡¢ ÒÔSelf Host·½Ê½¼ÄËÞWeb API

ÓëWCFÀàËÆ£¬¼ÄËÞWeb API²»Ò»¶¨ÐèÒªIISµÄÖ§³Ö£¬ÎÒÃÇ¿ÉÒÔ²ÉÓÃSelf HostµÄ·½Ê½Ê¹ÓÃÈÎÒâÀàÐ͵ÄÓ¦ÓóÌÐò£¨¿ØÖÆÌ¨¡¢Windows FormsÓ¦Óá¢WPFÓ¦ÓÃÉõÖÁÊÇWindows Service£©×÷ΪËÞÖ÷¡£¶ÔÓÚÎÒÃÇÑÝʾµÄʵÀýÀ´Ëµ£¬ÏîÄ¿SelfHost´ú±íµÄ¿ØÖÆÌ¨³ÌÐò¾ÍÊÇÒ»¸ö²ÉÓÃSelf Host¼ÄËÞģʽµÄËÞÖ÷¡£

¶ÔÓÚSelfHostÕâôһ¸ö¿ÕµÄ¿ØÖÆÌ¨Ó¦ÓÃÀ´Ëµ£¬³ýÁËÐèÒªÌí¼ÓÕë¶ÔWebApiµÄÏîÄ¿ÒýÓÃÖ®Í⣬»¹ÐèÒªÌí¼ÓÈçÏÂ4¸ö³ÌÐò¼¯ÒýÓᣳýÁ˳ÌÐò¼¯¡°System.Net.Http.dll¡±£¨ËüÊôÓÚ.NET Framework Ô­ÉúµÄ³ÌÐò¼¯£©Ö®Í⣬ÆäÓà3¸ö¾ù¿ÉÒÔÔÚĿ¼¡°%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\¡±ÖÐÕÒµ½¡£

System.Web.Http.dll £¨\ Microsoft.AspNet. WebApi.Core.5.0.0\lib\net45\£©

System.Net.Formatting.Http.dll £¨\Microsoft.AspNet. WebApi.Client.5.0.0\lib\net45\£©

System.Web.Http.SelfHost.dll £¨\Microsoft.AspNet. WebApi.SelfHost.5.0.0\lib\net45\£©

System.Net.Http.dll

ͨ¹ýÉÏÃæµÄ½éÉÜÎÒÃÇ¿ÉÒÔ¿´µ½ÒÔWeb HostµÄ·½Ê½¼ÄËÞWeb APIÐèÒª×öµÄΨһһ¼þÊÂÇéÊÇ·ÓÉ×¢²á¡£µ«ÊǶÔÓÚSelf HostÀ´Ëµ£¬³ýÁ˱ØÐèµÄ·ÓÉ×¢²áÍ⣬ÎÒÃÇ»¹ÐèÒªÍê³É¶îÍâµÄÒ»¼þÊÂÇ飬¼´ÊÖ¹¤¼ÓÔØ¶¨ÒåÁËHttpControllerÀàÐ͵ijÌÐò¼¯¡£Õû¸ö¼ÄËÞ¹¤×÷ͨ¹ýÈçϼ¸Ðмòµ¥µÄ´úÂë¾Í¿ÉÒÔʵÏÖ¡£

1: class Program
2: {
3: static void Main(string[] args)
4: {
5: Assembly.Load("WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
6:
7: HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration (" http://localhost/selfhost");
8: using (HttpSelfHostServer httpServer = new HttpSelfHostServer(configuration))
9: {
10: httpServer.Configuration.Routes .MapHttpRoute(
11: name : " DefaultApi",
12: routeTemplate : "api/{controller}/{id}",
13: defaults : new { id = RouteParameter.Optional });
14:
15: httpServer.OpenAsync();
16: Console.Read();
17: }
18: }
19: }

ASP.NET Web APIµÄSelf Host¼ÄËÞ·½Ê½Í¨¹ýHttpSelfHostServerÀ´Íê³É¡£ÈçÉÏÃæµÄ´úÂëÆ¬¶ÏËùʾ£¬ÔÚÊÖ¹¤¼ÓÔØÁ˶¨ÒåContactsControllerÀàÐ͵ijÌÐò¼¯¡°WebApi.dll¡±Ö®ºó£¬ÎÒÃǸù¾ÝÖ¸¶¨µÄ»ùµØÖ·£¨¡°http://localhost/selfhost¡±)£¬×¢²á·ÓɵÄURLÄ£°å½«ÊÇÒÔ´Ë×÷Ϊ»ùµØÖ·µÄÏà¶ÔµØÖ·£©´´½¨ÁËÒ»¸öHttpSelfHostConfiguration¶ÔÏó£¬HttpSelfHostServerÓɸöÔÏó´´½¨¡£½ÓÏÂÀ´£¬ÎÒÃÇÀûÓô´½¨µÄHttpSelfHostConfiguration¶ÔÏ󣨶ÔÓ¦×ÅHttpSelfHostServerµÄConfigurationÊôÐÔ£©µÄRoutesµÃµ½È«¾Ö·ÓÉ±í£¬²¢µ÷ÓÃÀ©Õ¹·½·¨MapHttpRoute×¢²áÁËÓëWeb Host¼ÄËÞ·½Ê½Ò»ÑùµÄ·ÓÉ¡£µ±ÎÒÃǵ÷ÓÃOpenAsync·½·¨³É¹¦¿ªÆôHttpSelfHostServerÖ®ºó£¬·þÎñÆ÷¿ªÊ¼¼àÌýÀ´×ÔÍøÂçµÄµ÷ÓÃÇëÇó¡£

Èç¹û¶ÁÕßÅóÓÑÃǶÔWCF±È½ÏÊìϤµÄ»°£¬Ó¦¸ÃÇå³þÔÚ½øÐÐWCF·þÎñ¼ÄËÞµÄʱºòÎÒÃDZØÐëÖ¸¶¨¼ÄËÞ·þÎñµÄÀàÐÍ£¬µ«ÊǶÔÓÚASP.NET Web APIµÄ¼ÄËÞÀ´Ëµ£¬²»ÂÛÊÇWeb Host»¹ÊÇSelf Host£¬ÎÒÃǶ¼ÎÞÐèÖ¸¶¨HttpControllerµÄÀàÐÍ¡£»»¾ä»°Ëµ£¬WCF·þÎñ¼ÄËÞÊÇÕë¶Ô¾ßÌåij¸ö·þÎñÀàÐ͵쬶øASP.NET Web APIµÄ¼ÄËÞÔòÊÇÅúÁ¿½øÐеġ£

ASP.NET Web APIµÄÅúÁ¿¼ÄËÞÔ´×ÔËü¶ÔHttpControllerÀàÐ͵ÄÖÇÄܽâÎö£¬Ëü»á´Ó¡°ÌṩµÄ¡±µÄ³ÌÐò¼¯ÁбíÖнâÎö³öËùÓÐHttpControllerÀàÐÍ£¨ËùÓÐʵÏÖÁËIHttpController½Ó¿ÚµÄÀàÐÍ£©¡£¶ÔÓÚWeb HostÀ´Ëµ£¬Ëü»áÀûÓÃBuildManager»ñµÃµ±Ç°ÏîĿֱ½Ó»òÕß¼ä½ÓÒýÓõijÌÐò¼¯£¬µ«ÊǶÔÓÚSelf HostÀ´Ëµ£¬HttpControllerÀàÐ͵ĽâÎöÔÚĬÈÏÇé¿öÏÂÖ»»áÕë¶Ô¼ÓÔØµ½µ±Ç°Ó¦ÓóÌÐòÓòÖеijÌÐò¼¯ÁÐ±í£¬ÕâÒ²ÊÇÎÒÃÇΪºÎÐèÒªÊÖ¹¤¼ÓÔØ¶¨ÒåÁËContactsControllerÀàÐ͵ijÌÐò¼¯µÄÔ­ÒòËùÔÚ¡£

Èç¹ûÏÖÔÚÔËÐÐÕâ¸ö×÷ΪËÞÖ÷µÄ¿ØÖÆÌ¨³ÌÐò£¬ÎÒÃÇÒÀÈ»¿ÉÒÔ¶Ô¼ÄËÞÆäÖеÄWeb API·¢Æðµ÷Óá£Í¬Ñù²ÉÓÃä¯ÀÀÆ÷×÷Ϊ²âÊÔ¹¤¾ß£¬ÔÚ·Ö±ð·ÃÎÊÄ¿±êµØÖ·¡°http://localhost/selfhost/api/contacts¡± ºÍ¡°http://localhost/selfhost/api/contacts/001¡±ºó£¬ÎÒÃÇÒÀÈ»»áµÃµ½ÉÏÃæµÄ½á¹û¡£

Îå¡¢ÀûÓÃHttpClientµ÷ÓÃWeb API

¶ÔÓÚÒ»¸ö.NET¿Í»§¶Ë³ÌÐò£¬Ëü¿ÉÒÔÀûÓÃHttpClientÀ´½øÐÐWeb APIµÄµ÷Óá£ÓÉÓÚWeb APIµÄµ÷Óñ¾ÖÊÉϾÍÊÇÒ»´ÎÆÕͨµÄ·¢ËÍÇëÇó/½ÓÊÕÏìÓ¦µÄ¹ý³Ì£¬ËùÒÔHttpClientÆäʵ¿ÉÒÔ×÷Ϊһ°ãÒâÒåÉÏ·¢ËÍHTTPÇëÇóµÄ¹¤¾ß¡£ÔÚConsoleApp´ú±íµÄ¿ØÖÆÌ¨Ó¦ÓÃÖУ¬ÎÒÃÇÀûÓÃHttpClientÀ´µ÷ÓÃÒÔSelf Host·½Ê½¼ÄËÞµÄWeb API¡£

ÓÉÓÚÎÒÃÇÐèҪʹÓõ½´ú±íÁªÏµÈ˵ÄÊý¾ÝÀàÐÍContact£¬ËùÒÔÐèҪΪ¸ÃÏîÄ¿Ìí¼ÓÕë¶ÔCommonµÄÏîÄ¿ÒýÓá£HttpClient¶¨ÒåÔÚ³ÌÐò¼¯¡°System.Net.Http.dll¡±ÖУ¬ËùÒÔÕë¶Ô¸Ã³ÌÐò¼¯µÄÒýÓÃÒ²ÊDZØÐèµÄ¡£³ý´ËÖ®Í⣬ÎÒÃÇ»¹ÐèÒªÌí¼ÓÕë¶Ô³ÌÐò¼¯¡°System.Net.Formatting.Http.dll¡±µÄÒýÓã¬ÒòΪÐòÁл¯ÇëÇóºÍ·´ÐòÁл¯ÏìÓ¦µÄÏà¹ØÀàÐͶ¨ÒåÔڴ˳ÌÐò¼¯ÖС£

ÈçÏÂËùʾµÄÊÇÕû¸öWeb APIµ÷ÓóÌÐòµÄ¶¨Ò壬ÎÒÃÇÀûÓÃHttpClientµ÷ÓÃWeb APIʵÏÖÁËÕë¶ÔÁªÏµÈ˵ĻñÈ¡¡¢Ìí¼Ó¡¢Ð޸ĺÍɾ³ý¡£ÓÉÓÚHttpClientÌṩµÄ´ó²¿·Ö·½·¨¶¼²ÉÓÃÕë¶ÔTaskµÄÒì²½±à³ÌÐÎʽ£¬ËùÒÔÎÒÃǽ«ËùÓеIJÙ×÷¶¨ÒåÔÚÒ»¸ö±ê¼ÇΪ¡°async¡±µÄ¾²Ì¬·½·¨ProcessÖУ¬ÒÔ±ãÎÒÃÇ¿ÉÒÔʹÓá°await¡±¹Ø¼ü×Ö±àдͬ²½´úÂë¡£

1: class Program
2: {
3: static void Main(string[] args)
4: {
5: Process();
6: Console.Read();
7: }
8:
9: private async static void Process()
10: {
11: //»ñÈ¡µ±Ç°ÁªÏµÈËÁбí
12: HttpClient httpClient = new HttpClient();
13: HttpResponseMessage response = await httpClient.GetAsync ("http://localhost/selfhost/api/contacts");
14: IEnumerable<Contact> contacts = await response.Content.ReadAsAsync< IEnumerable< Contact>>();
15: Console.WriteLine("µ±Ç°ÁªÏµÈËÁÐ±í£º");
16: ListContacts(contacts);
17:
18: //Ìí¼ÓеÄÁªÏµÈË
19: Contact contact = new Contact { Name = "ÍõÎå", PhoneNo = "0512-34567890", EmailAddress = " wangwu@gmail.com" };
20: await httpClient.PostAsJsonAsync<Contact> ("http://localhost/selfhost /api/contacts", contact);
21: Console.WriteLine ("Ìí¼ÓÐÂÁªÏµÈË¡°ÍõÎ塱£º");
22: response = await httpClient.GetAsync(" http://localhost/selfhost/api /contacts");
23: contacts = await response.Content.ReadAsAsync<IEnumerable< Contact>>();
24: ListContacts(contacts);
25:
26: //ÐÞ¸ÄÏÖÓеÄij¸öÁªÏµÈË
27: response = await httpClient.GetAsync (" http://localhost/selfhost/api/ contacts/001");
28: contact = (await response.Content.ReadAsAsync< IEnumerable<Contact>>()) .First();
29: contact.Name = "ÕÔÁù";
30: contact.EmailAddress = "zhaoliu@gmail.com";
31: await httpClient.PutAsJsonAsync< Contact>("http://localhost/selfhost/api/ contacts/001", contact);
32: Console.WriteLine( "ÐÞ¸ÄÁªÏµÈË¡°001¡±ÐÅÏ¢£º");
33: response = await httpClient.GetAsync ("http://localhost/selfhost/api/ contacts");
34: contacts = await response.Content.ReadAsAsync<IEnumerable< Contact>>();
35: ListContacts(contacts);
36:
37: //ɾ³ýÏÖÓеÄij¸öÁªÏµÈË
38: await httpClient.DeleteAsync ("http://localhost/selfhost/api/contacts/ 002");
39: Console.WriteLine("ɾ³ýÁªÏµÈË¡°002¡±£º");
40: response = await httpClient.GetAsync ("http://localhost/selfhost/api/contacts");
41: contacts = await response.Content.ReadAsAsync< IEnumerable< Contact>>();
42: ListContacts(contacts);
43: }
44:
45: private static void ListContacts (IEnumerable<Contact> contacts)
46: {
47: foreach (Contact contact in contacts)
48: {
49: Console.WriteLine("{0,-6} {1,-6}{2,-20}{3,-10}", contact.Id, contact.Name, contact.EmailAddress, contact.PhoneNo);
50: }
51: Console.WriteLine();
52: }
53: }

ÈçÉÏÃæµÄ´úÂëÆ¬¶ÎËùʾ£¬ÎÒÃÇ´´½¨ÁËÒ»¸öHttpClient¶ÔÏó²¢µ÷ÓÃÆäGetAsync·½·¨ÏòÄ¿±êµØÖ·¡°http://localhost/selfhost/api/contacts¡±·¢ËÍÁËÒ»¸öGETÇëÇ󣬷µ»ØµÄ¶ÔÏóHttpResponseMessage±íʾ½ÓÊÕµ½µÄÏìÓ¦¡£¸ÃHttpResponseMessage¶ÔÏóµÄContentÊôÐÔ·µ»ØÒ»¸ö±íʾÏìÓ¦Ö÷ÌåÄÚÈݵÄHttpContent¶ÔÏó£¬ÎÒÃǵ÷ÓÃÆäReadAsAsync<T>·½·¨¶ÁÈ¡ÏìÓ¦Ö÷ÌåÄÚÈݲ¢½«Æä·´ÐòÁл¯³ÉÒ»¸öContact¼¯ºÏ¡£ÎÒÃǽ«±íʾµ±Ç°ÁªÏµÈËÁбíµÄContact¼¯ºÏÊä³öÔÚ¿ØÖÆÌ¨ÉÏ¡£

ÎÒÃǽÓÏÂÀ´µ÷ÓÃHttpClientµÄPostAsJsonAsync<T>·½·¨ÏòÄ¿±êµØÖ·¡°http://localhost/selfhost/api/contacts¡±·¢ËÍÒ»¸öPOSTÇëÇóÒÔÌí¼ÓÒ»¸öеÄÁªÏµÈË¡£ÕýÈç·½·¨Ãû³ÆËùÌåÏֵģ¬×÷Ϊ²ÎÊýµÄContact¶ÔÏó½«ÒÔJSON¸ñʽ±»Ð´ÈëÇëÇóµÄÖ÷Ì岿·Ö¡£ÇëÇó±»Õý³£·¢ËͲ¢½ÓÊÕµ½ÏìÓ¦Ö®ºó£¬ÎÒÃÇ»á´òÓ¡³öµ±Ç°ÁªÏµÈËÁÐ±í¡£

ÔÚ´ËÖ®ºó£¬ÎÒÃÇÏòÄ¿±êµØÖ·¡°http://localhost/selfhost/api/contacts/001¡±·¢ËÍÒ»¸öGETÇëÇóÒÔ»ñÈ¡IDΪ¡°001¡±µÄÁªÏµÈË¡£ÔÚÐÞ¸ÄÁËÁªÏµÈ˵ÄÐÕÃû£¨¡°ÕÔÁù¡±£©ºÍµç×ÓÓÊÏ䣨¡°zhaoliu@gmail.com¡±£©Ö®ºó£¬ÎÒÃǽ«Æä×÷Ϊ²ÎÊýµ÷ÓÃHttpClientµÄPutAsJsonAsync<T>·½·¨£¬ÒÔ´ËÏòÄ¿±êµØÖ·¡°http://localhost/selfhost/api/contacts/001¡±·¢ËÍÒ»¸öPUTÇëÇóÒÔ¸üжÔÓ¦ÁªÏµÈ˵ÄÏà¹ØÐÅÏ¢¡£ÁªÏµÈËÐÅÏ¢ÊÇ·ñÕý³£¸üÐÂͬÑùͨ¹ýÊä³öµ±Ç°ËùÓÐÁªÏµÈËÁбíÀ´Ö¤Êµ¡£

ÎÒÃÇ×îºóµ÷ÓÃHttpClientµÄDeleteAsync·½·¨ÏòµØÖ·¡°http://localhost/selfhost/api/contacts/002¡±·¢ËÍÒ»¸öDELETEÇëÇóÒÔɾ³ýIDΪ¡°002¡±µÄÁªÏµÈ˲¢Í¨¹ýÊä³öµ±Ç°ËùÓÐÁªÏµÈËÁбíÀ´Ö¤ÊµÉ¾³ý²ÎÊýÊÇ·ñ³É¹¦Íê³É¡£

ÎÒÃÇÔÚÔËÐÐËÞÖ÷³ÌÐòSelfHostÖ®ºóÆô¶¯´ËConsoleApp³ÌÐò£¬»áÔÚ¿ØÖÆÌ¨Éϵõ½ÏÂËùʾµÄÊä³ö½á¹û£¬ÓÉ´Ë¿ÉÒÔ¿´³öͨ¹ýµ÷ÓÃHttpClientµÄGetAsync¡¢PostAsJsonAsync¡¢PutAsJsonAsyncºÍDeleteAsync·½·¨°ïÖúÎÒÃdzɹ¦Íê³ÉÁËÕë¶ÔÁªÏµÈ˵ĻñÈ¡¡¢Ìí¼Ó¡¢Ð޸ĺÍɾ³ý¡£

1: µ±Ç°ÁªÏµÈËÁÐ±í£º
2: 001 ÕÅÈý zhangsan@gmail.com 0512-12345678
3: 002 ÀîËÄ lisi@gmail.com 0512-23456789
4:
5: Ìí¼ÓÐÂÁªÏµÈË¡°ÍõÎ塱£º
6: 001 ÕÅÈý zhangsan@gmail.com 0512-12345678
7: 002 ÀîËÄ lisi@gmail.com 0512-23456789
8: 003 ÍõÎå wangwu@gmail.com 0512-34567890
9:
10: ÐÞ¸ÄÁªÏµÈË¡°001¡±ÐÅÏ¢£º
11: 002 ÀîËÄ lisi@gmail.com 0512-23456789
12: 003 ÍõÎå wangwu@gmail.com 0512-34567890
13: 001 ÕÔÁù zhaoliu@gmail.com 0512-12345678
14:
15: ɾ³ýÁªÏµÈË¡°002¡±£º
16: 003 ÍõÎå wangwu@gmail.com 0512-34567890
17: 001 ÕÔÁù zhaoliu@gmail.com 0512-12345678

Áù¡¢´´½¨Ò»¸ö¡°ÁªÏµÈ˹ÜÀíÆ÷¡±Ó¦ÓÃ

ÎÒÃÇ×îºóÀ´´´½¨Ò»¸ö½Ð×ö¡°ÁªÏµÈ˹ÜÀíÆ÷¡±µÄWebÓ¦Óá£ÕâÊÇÒ»¸öµ¥ÍøÒ³Ó¦Óã¬ÎÒÃDzÉÓÃAjaxµÄÇëÇóµÄÐÎʽµ÷ÓÃÒÔWeb Hostģʽ¼ÄËÞµÄWeb APIʵÏÖÕë¶ÔÁªÏµÈ˵ÄCRUD²Ù×÷¡£ÔÚÕýʽ½éÉܱà³ÌʵÏÖ֮ǰ£¬ÎÒÃDz»·ÁÀ´¿´¿´¸ÃÓ¦ÓÃÔËÐÐÆðÀ´µÄЧ¹û¡£

ÈçÓÒͼËùʾ£¬µ±Ò³Ãæ±»¼ÓÔØÖ®ºó£¬µ±Ç°ÁªÏµÈËÁбí»áÒÔ±í¸ñµÄÐÎʽ³ÊÏÖ³öÀ´¡£ÎÒÃÇ¿ÉÒÔÀûÓÃÿÌõÁªÏµÈ˼ǼÓÒ²àµÄ¡°Ð޸ġ±ºÍ¡°É¾³ý¡±Á´½ÓʵÏÖÕë¶Ôµ±Ç°ÁªÏµÈ˵ı༭ºÍɾ³ý¡£³ý´ËÖ®Í⣬ÎÒÃÇ»¹¿ÉÒÔµã»÷×óÏ·½µÄ¡°Ìí¼ÓÁªÏµÈË¡±°´Å¥Ìí¼ÓÒ»¸öеÄÁªÏµÈË¡£

Èç¹ûÎÒÃǵã»÷¡°É¾³ý¡±Á´½Ó£¬µ±Ç°ÁªÏµÈË»áÖ±½Ó±»É¾³ý¡£Èç¹ûÎÒÃǵã»÷ÁË¡°Ð޸ġ±Á´½Ó»òÕß¡°Ìí¼ÓÁªÏµÈË¡±°´Å¥£¬±»Ð޸ĻòÕßÌí¼ÓµÄÁªÏµÈËÐÅÏ¢»áÏÔʾÔÚÈçÏÂͼËùʾµÄÒ»¸öµ¯³öµÄ¡°Ä£Ì¬¡±¶Ô»°¿òÖС£ÔÚÎÒÃÇÊäÈëÁªÏµÈËÏà¹Ø×ÊÁϺóµã»÷¡°±£´æ¡±°´Å¥£¬ÁªÏµÈ˻ᱻ³É¹¦Ð޸ĻòÕßÌí¼Ó¡£±»Ð޸ĵÄÏÖÓÐÁªÏµÈËÐÅÏ¢»òÕß±»Ìí¼ÓµÄÁªÏµÈË»áÁ¢¼´ÌåÏÖÔÚÁбíÖ®ÖС£

ËäÈ»Õâ½ö½öÊÇÒ»¸ö¼òµ¥µÄWebÓ¦Ó㬵«ÊÇÎÒ¿ÌÒâʹÓÃÁË3¸öÖ÷Á÷µÄWebǰ¶Ë¿ª·¢¿ò¼Ü£¬ËüÃÇ·Ö±ðÊÇjQuery¡¢BootstrapºÍKnockOut£¬ÕâÈý¸ö¿ò¼ÜµÄʹÓÃÌåÏÖÔÚÒ³ÃæÒýÓõÄCSSºÍJavaScriptÎļþÉÏ¡£

1: <!DOCTYPE html>
2: <html xmlns="http://www.w3.org/1999/xhtml">
3: <head>
4: <title>ÁªÏµÈ˹ÜÀíÆ÷</title>
5: <link href="css/bootstrap.min.css" rel="stylesheet">
6: </head>
7: <body>
8: ...
9: <script src="Scripts/jquery-1.10.2.min.js"> </script>
1:
2: <script src="Scripts/bootstrap.min.js"></script>
2: <script src="Scripts/knockout-3.0.0.js"></script>
2: <script src="Scripts/viewmodel.js"></script>
10: </body>
11: </html>

jQuery£¬Õâ¸ö¡°µØÇòÈ˶¼ÖªµÀ¡±µÄJavaScript¿ò¼Ü£¬ÎÒÃÇÎÞÐë¶ÔËü×÷ÈκνéÉÜÁË¡£Bootstrap ÊǼ¯ HTML¡¢CSS ºÍ JavaScript ÓÚÒ»Ì壬ÊÇÓÉ΢²©µÄÏÈÇý Twitter ÔÚ2011Äê8Ô¿ªÔ´µÄÕûÌ×ǰ¶Ë½â¾ö·½°¸£¬Web ¿ª·¢ÈËÔ±ÀûÓÃËüÄܹ»ÇáËɴ³ö¾ßÓÐÇåˬ·ç¸ñµÄ½çÃæÒÔ¼°ÊµÏÖÁ¼ºÃµÄ½»»¥Ð§¹ûµÄWebÓ¦Óá£BootstrapÊÇASP.NET MVC 5ĬÈÏÖ§³ÖµÄ¿ò¼Ü£¬µ±ÎÒÃÇÀûÓÃVisual Stduio´´½¨Ò»¸öASP.NET MVCÏîĿʱ£¬ÏîĿĿ¼Ï¾Ͱüº¬ÁËBootstrapÏà¹ØµÄCSSºÍJavaScriptÎļþ¡£

ÔÚ±¾ÀýÖУ¬ÎÒÃÇÖ÷ÒªÀûÓÃjQueryÀ´ÊµÏÖÒÔAjax·½Ê½µ÷ÓÃWeb API£¬Í¬Ê±ËüÒ²ÊÇÆäËûÁ½¸ö¿ò¼Ü£¨BootstrapºÍKnockOut£©µÄ»ù´¡¿ò¼Ü¡£ÖÁÓÚBootstrap£¬ÎÒÃÇÔòÖ÷ҪʹÓÃËüµÄÒ³Ãæ²¼¾Ö¹¦ÄܺÍËüÌṩµÄCSS¡£³ý´ËÖ®Í⣬¡°±à¼­ÁªÏµÈË¡±¶Ô»°¿ò¾ÍÊÇÀûÓÃBootstrapÌṩµÄJavaScript×é¼þʵÏֵġ£

MVVMÓëKnockout

¿¼Âǵ½¿ÉÄÜÓÐÈ˶ÔKnockout£¨ÒÔϼò³ÆKO£©Õâ¸öJavaScript¿ò¼Ü²»Ì«ÊìϤ£¬ÔÚÕâÀïÎÒÃǶÔËü×÷һϸÅÀ¨ÐԵĽéÉÜ¡£KOÊÇ΢Èí½«Ó¦ÓÃÓÚWPF/SilverlightµÄMVVMģʽÔÚWebÉϵij¢ÊÔ£¬ÕâÊÇÒ»¸ö·Ç³£ÓÐÓõÄJavaScript¿ò¼Ü¡£¶ÔÓÚÃæÏòÊý¾ÝµÄWebÓ¦ÓÃÀ´Ëµ£¬MVVMģʽÊÇÒ»Ïî²»´íµÄÑ¡Ôñ£¬Ëü½èÖú¿ò¼ÜÌṩµÄ¡°°ó¶¨¡±»úÖÆÊ¹ÎÒÃÇÎÞÐè¹ý¶à¹Ø×¢UI£¨HTML£©µÄϸ½Ú£¬Ö»ÐèÒª²Ù×÷°ó¶¨µÄÊý¾ÝÔ´¡£MVVM×îÔ类΢ÈíÓ¦ÓÃÓÚWPF/SLµÄ¿ª·¢£¬ËùÒÔÕë¶ÔWebµÄMVVM¿ò¼ÜÀ´Ëµ£¬Knockout£¨ÒÔϼò³ÆKO£©ÎÞÒÉÊÇ¡°¸ùÕýÃçºì¡±¡£

MVVM¿ÉÒÔ¿´³ÉÊÇMVCģʽµÄÒ»¸ö±äÌ壬Controller±»View ModelÈ¡´ú£¬µ«Á½Õß¾ßÓв»Í¬µÄÖ°ÄÜ£¬ÈýÔªËØÖ®¼äµÄ½»»¥Ò²²»Ïàͬ¡£ÒÔͨ¹ýKOʵÏÖµÄMVVMΪÀý£¬ÆäºËÐÄÊÇ¡°°ó¶¨¡±£¬ÎÒ¸öÈËÓÖ½«Æä·ÖΪ¡°Êý¾ÝµÄ°ó¶¨¡±ºÍ¡°ÐÐΪµÄ°ó¶¨¡±¡£ËùνÊý¾ÝµÄ°ó¶¨£¬¾ÍÊǽ«View Model¶¨ÒåµÄÊý¾Ý°ó¶¨µ½ViewÖеÄUIÔªËØ£¨HTMLÔªËØ£©ÉÏ£¬KOͬʱ֧³Öµ¥ÏòºÍË«Ïò°ó¶¨¡£ÐÐΪ°ó¶¨ÌåÏÖΪʼþ×¢²á£¬¼´ViewÖÐUIÔªËØµÄʼþ£¨±ÈÈçij¸ö<button>ÔªËØµÄclickʼþ£©ÓëView Model¶¨ÒåµÄ·½·¨£¨function£©½øÐа󶨡£

ÈçÏÂͼËùʾ£¬Óû§ÐÐΪ£¨±ÈÈçij¸öÓû§µã»÷ÁËÒ³ÃæÉϵÄij¸ö°´Å¥£©Ê×ÏÈ´¥·¢ViewµÄij¸öʼþ£¬ÓëÖ®°ó¶¨µÄ¶¨ÒåÔÚView ModelÖеÄEventHandler£¨View ModelµÄij¸ö·½·¨³ÉÔ±£©±»×Ô¶¯Ö´ÐС£Ëü¿ÉÒÔÖ´ÐÐModel£¬²¢ÐÞ¸Ä×ÔÉíά»¤µÄÊý¾Ý£¬Èç¹ûViewºÍView ModelµÄÊý¾Ý°ó¶¨ÊÇË«ÏòµÄ£¬Óû§ÔÚ½çÃæÉÏÊäÈëµÄÊý¾Ý¿ÉÒÔ±»View Model²¶»ñ£¬View Model¶ÔÊý¾ÝµÄ¸üпÉÒÔ×Ô¶¯·´Ó³ÔÚViewÉÏ¡£ÕâÑùµÄºÃ´¦ÏÔ¶øÒ×¼û£ºÎÒÃÇÔÚͨ¹ýJavaScript¶¨ÒåUI´¦ÀíÂß¼­µÄʱºò£¬ÎÞÐè¹Ø×¢ViewµÄϸ½Ú£¨ViewÉϵÄHTML£©£¬Ö»ÐèÒª¶Ô×ÔÉíµÄÊý¾Ý½øÐвÙ×÷¼´¿É¡£

ÎÒÃÇͨ¹ýÒ»¸ö¼òµ¥µÄÀý×ÓÀ´ËµÃ÷Á½ÖÖ°ó¶¨ÔÚKOÖеÄʵÏÖ¡£¼ÙÉèÎÒÃÇÐèÒªÉè¼ÆÈçÏÂͼËùʾµÄ¡°µØÖ·±à¼­Æ÷Ò³Ãæ¡±£¬ÔÚÒ³Ãæ¼ÓÔØµÄʱºòËü»á½«Ä¬ÈϵĵØÖ·ÐÅÏ¢°ó¶¨µ½±íʾʡ¡¢ÊС¢ÇøºÍ½ÖµÀµÄÎı¾¿òºÍÏÔʾÍêÕûµØÖ·ÐÅÏ¢µÄ<span>ÔªËØÉÏ£¬µ±Óû§ÔÚÎı¾¿òÖÐÊäÈëеÄÖµ²¢µã»÷¡°È·ÈÏ¡±°´Å¥ºó£¬ÏÔʾµÄÍêÕûµØÖ·»áÏàÓ¦µÄ±ä»¯¡£

ÎÒÃÇ¿ÉÒÔÀûÓÃKO°´ÕÕÈçϵķ½Ê½À´ÊµÏÖµØÖ·ÐÅÏ¢µÄ°ó¶¨ºÍ´¦ÀíÓû§Ìá½»µÄ±à¼­È·ÈÏÇëÇó¡£ÎÒÃÇÊ×ÏÈÐèҪͨ¹ýÒ»¸öº¯ÊýÀ´´´½¨±íʾView ModelµÄ¡°Àࡱ£¬ÐèÒª°ó¶¨µÄÊý¾ÝºÍº¯Êý½«×÷Ϊ¸ÃÀàµÄ³ÉÔ±£¬×é³ÉViewµÄHTMLÔªËØÔòͨ¹ýÄÚÁªµÄ¡°data-bind¡±ÊôÐÔʵÏÖÊý¾Ý°ó¶¨ºÍʼþ×¢²á¡£ÎÒÃÇ×îÖÕÐèÒª´´½¨View Model¶ÔÏ󣬲¢½«Æä×÷Ϊ²ÎÊýµ÷ÓÃko.applyBindings·½·¨½«°ó¶¨Ó¦Óõ½µ±Ç°Ò³Ãæ¡£

1: <div>
2: <div><label>Ê¡:</label> <input data-bind="value: province" /></div>
3: <div><label>ÊÐ:</label> <input data-bind="value: city" /></div>
4: <div><label>Çø:</label> <input data-bind="value: district" /></div>
5: <div><label>½ÖµÀ:</label> <input data-bind="value: street"/>
6: <div><label>µØÖ·:</label> <span data-bind="text: address"></span></div>
7: <div><input type="button" data-bind="click: format" value="È·¶¨"/></div>
8: </div>
9:
10: <script type="text/javascript" >
1:
2: function AddressModel() {
3: var self = this;
4: self.province = ko.observable("½­ËÕÊ¡");
5: self.city = ko.observable("ËÕÖÝÊÐ");
6: self.district = ko.observable("¹¤ÒµÔ°Çø");
7: self.street = ko.observable("ÐǺþ½Ö328ºÅ");
8: self.address = ko.observable();
9:
10: self.format = function () {
11: if (self.province() && self.city() && self.district() && self.street()){
12: var address = self.province() + " " + self.city() + & quot; " + self.district() + " " + self.street();
13: self.address (address);
14: }
15: else {
16: alert("ÇëÌṩÍêÕûµÄµØÖ·ÐÅÏ¢");
17: }
18: };
19:
20: self.format();
21: }
22:
23: ko.applyBindings(new AddressModel());
</script>

ÈçÉÏÃæµÄ´úÂëÆ¬¶ÎËùʾ£¬ÎÒÃǶ¨ÒåÁËÒ»¸öÃûΪAddressModelµÄÀà×÷ΪÕû¸ö¡°µØÖ·±à¼­¡±Ò³ÃæµÄView Model£¬AddressModelµÄÎå¸öÊý¾Ý³ÉÔ±£¨province¡¢city¡¢district¡¢streetºÍaddress£©±íʾµØÖ·µÄËĸö×é³É²¿·ÖºÍ¸ñʽ»¯µÄµØÖ·¡£ËüÃǶ¼ÊÇ»ùÓÚË«Ïò°ó¶¨µÄObservableÀàÐͳÉÔ±£¬Òâζ×ÅÓû§µÄÊäÈëÄܹ»¼´Ê±¸Ä±ä°ó¶¨µÄÊý¾ÝÔ´£¬¶øÊý¾ÝÔ´µÄ¸Ä±äÒ²Äܼ´Ê±µØ·´Ó³Ôڰ󶨵ÄHTMLÔªËØÉÏ¡£ObservableÊý¾Ý³ÉÔ±ÊÇÒ»¸öͨ¹ýµ÷ÓÃko.observable·½·¨´´½¨µÄº¯Êý£¬·½·¨µ÷ÓÃÖ¸¶¨µÄ²ÎÊý±íʾ¸üеÄÊý¾Ý¡£

AddressModelµÄÁíÒ»¸ö³ÉÔ±formatÊÇÒ»¸ö×Ô¶¨ÒåµÄº¯Êý£¬¸Ãº¯Êý½øÐеØÖ·¸ñʽ»¯²¢Óøñʽ»¯µÄµØÖ·¸üÐÂaddress×ֶΡ£ÓÉÓÚaddress×Ö¶ÎÊÇÒ»¸öObservable³ÉÔ±£¬Ò»µ©ËüµÄÖµ·¢Éú¸Ä±ä£¬±»°ó¶¨µÄHTMLÔªËØµÄÖµ½«»á×Ô¶¯¸üС£

AddressModelµÄÁù¸ö×ֶηֱð°ó¶¨ÔÚÁù¸öHTMLÔªËØÉÏ£¬ÆäÖÐprovince¡¢city¡¢districtºÍstreet×ֶΰ󶨵½´ú±í¶ÔÓ¦Îı¾¿òµÄValueÊôÐÔÉÏ£¨data-bind="value: {³ÉÔ±Ãû³Æ}"£©£¬¶øaddress×Ö¶ÎÔò°ó¶¨µ½ÓÃÓÚÏÔʾ¸ñʽ»¯µØÖ·µÄ<span>ÔªËØµÄTextÊôÐÔÉÏ£¨data-bind="text: {³ÉÔ±Ãû³Æ}"£©£¬ÓÃÓÚ¸ñʽ»¯µØÖ·µÄformat×Ö¶ÎÔòÓë¡°È·¶¨¡±°´Å¥µÄclickʼþ½øÐа󶨣¨data-bind="click: {³ÉÔ±Ãû³Æ}"£©¡£ÕæÕýµÄ°ó¶¨¹¤×÷·¢ÉúÔÚko.applyBindings·½·¨±»µ÷ÓõÄʱºò¡£

ViewModel

½ÓÏÂÀ´ÎÒÃÇÀ´¿´¿´¡°ÁªÏµÈ˹ÜÀíÆ÷¡±Õâ¸öWebÒ³Ãæ¾¿¾¹ÈçºÎÀ´¶¨Òå¡£¾ßÌåÀ´Ëµ£¬¸ÃÒ³ÃæµÄÄÚÈݰüº¬Á½¸ö²¿·Ö£¬HTML±êÇ©ºÍJavaScript´úÂë¡£¶ÔÓÚºóÕߣ¬ÆäÖ÷ÒªÌåÏÖÔÚ¾ßÓÐÈç϶¨ÒåµÄView ModelÉÏ£¬ÎÒÃǽ«Ëü¶¨ÒåÔÚ¶ÀÁ¢µÄJavaScriptÎļþ£¨viewmodel.js£©ÖС£

1: function ViewModel() {
2: self = this;
3: self.contacts = ko.observableArray(); //µ±Ç°ÁªÏµÈËÁбí
4: self.contact = ko.observable(); //µ±Ç°±à¼­ÁªÏµÈË
5:
6: //»ñÈ¡µ±Ç°ÁªÏµÈËÁбí
7: self.load = function () {
8: $.ajax({
9: url : "http://localhost/webhost/api/contacts",
10: type : "GET",
11: success : function (result) {
12: self.contacts(result);
13: }
14: });
15: };
16:
17: //µ¯³ö±à¼­ÁªÏµÈ˶Ի°¿ò
18: self.showDialog = function (data) {
19: //ͨ¹ýIdÅжÏ"Ìí¼Ó/ÐÞ¸Ä"²Ù×÷
20: if (!data.Id) {
21: data = { ID: "", Name: "", PhoneNo: "", EmailAddress: "",
22: Address: "" }
23: }
24: self.contact(data);
25: $(".modal").modal('show');
26: };
27:
28: //µ÷ÓÃWeb APIÌí¼Ó/ÐÞ¸ÄÁªÏµÈËÐÅÏ¢
29: self.save = function () {
30: $(".modal").modal('hide');
31: if (self.contact().Id) {
32: $.ajax({
33: url : "http://localhost/webhost /api/contacts/" + self.contact.Id,
34: type : "PUT",
35: data : self.contact(),
36: success : function () {self.load();}
37: });
38: }
39: else {
40: $.ajax({
41: url : "http://localhost/webhost/ api/contacts",
42: type : "POST",
43: data : self.contact(),
44: success : function () {self.load();}
45: });
46: }
47: };
48:
49: //ɾ³ýÏÖÓÐÁªÏµÈË
50: self.delete = function (data) {
51: $.ajax({
52: url : "http://localhost/webhost/api/ contacts/" + data.Id,
53: type : "DELETE",
54: success : function () {self.load();}
55: });
56: };
57:
58: self.load();
59: }
60:
61: $(function () {
62: ko.applyBindings(new ViewModel());
63: });

¶ÔÓÚÉÏÃæ¶¨ÒåµÄ×÷ΪÕû¸öÒ³ÃæView ModelµÄ¡°ÀàÐÍ¡±£¨ViewModel£©À´Ëµ£¬Ëü¾ßÓÐÁ½¸ö¡°Êý¾Ý¡±³ÉÔ±£¨ÆäʵÊǺ¯Êý£©contactsºÍcontact£¬Ç°Õß±íʾµ±Ç°ÁªÏµÈËÁÐ±í£¬ºóÕßÔò±íʾµ±Ç°Ð޸ĻòÕßÌí¼ÓµÄÁªÏµÈË¡£contactsºÍcontact·Ö±ðͨ¹ýµ÷Ó÷½·¨observableArrayºÍobservable´´½¨£¬ËùÒÔËüÃǾùÖ§³ÖË«Ïò°ó¶¨¡£ÕâÁ½¸öÊý¾Ý³ÉÔ±·Ö±ð±»°ó¶¨µ½³ÊÏÖµ±Ç°ÁªÏµÈ˵ıí¸ñºÍÓÃÓڱ༭ÁªÏµÈËÐÅÏ¢µÄ¶Ô»°¿òÖС£³ýÁËÕâÁ½¸öÊý¾Ý³ÉÔ±Ö®Í⣬ÎÒÃÇ»¹¶¨ÒåÁË4¸ö·½·¨³ÉÔ±¡£

load£º·¢ËÍAjaxÇëÇóµ÷ÓÃWeb APIÒÔ»ñÈ¡µ±Ç°ÁªÏµÈËÁÐ±í£¬²¢½«µÃµ½µÄÁªÏµÈËÁÐ±í¡°¸³Öµ¡±¸øcontactsÊôÐÔ¡£

showDialog£ºµ¯³ö¡°±à¼­ÁªÏµÈËÐÅÏ¢¡±¶Ô»°¿ò¡£ÎÒÃÇͨ¹ýÖ¸¶¨µÄÁªÏµÈ˶ÔÏóÊÇ·ñ¾ßÓÐIdÀ´Åжϵ±Ç°²Ù×÷ÊÇ¡°Ð޸ġ±»¹ÊÇ¡°Ìí¼Ó¡±¡£¶ÔÓÚºóÕߣ¬ÎÒÃǻᴴ½¨Ò»¸öеĶÔÏó×÷ΪÌí¼ÓµÄÁªÏµÈ˶ÔÏó¡£±»Ð޸ĻòÕßÌí¼ÓµÄÁªÏµÈ˶ÔÏ󱻡°¸³Öµ¡±¸øcontactÊôÐÔ¡£¶Ô»°¿òµÄµ¯³öͨ¹ýµ÷Óñíʾ¶Ô»°¿òµÄ<div>µÄmodal·½·¨ÊµÏÖ£¬¸Ã·½·¨ÊÇÓÉBootstrapÌṩµÄ¡£

save£º·¢ËÍAjaxÇëÇóµ÷ÓÃWeb APIÒÔÌí¼ÓеÄÁªÏµÈË»òÕßÐÞ¸ÄÏÖÓÐij¸öÁªÏµÈ˵ÄÐÅÏ¢¡£contactÊôÐÔ×÷ΪÌá½»µÄÊý¾Ý£¬ÖÁÓÚ¡°Ìí¼Ó¡±»¹ÊÇ¡°Ð޸ġ±£¬Í¬ÑùÊÇͨ¹ýËüÊÇ·ñ¾ßÓÐÏàÓ¦µÄIdÀ´¾ö¶¨¡£ÁªÏµÈ˳ɹ¦Ìí¼Ó»òÕßÐÞ¸ÄÖ®ºó£¬load·½·¨±»µ÷ÓÃÒÔˢе±Ç°ÁªÏµÈËÁÐ±í¡£

delete£º·¢ËÍAjaxÇëÇóµ÷ÓÃWeb APIÒÔɾ³ýÖ¸¶¨µÄÁªÏµÈË¡£ÁªÏµÈ˳ɹ¦É¾³ýÖ®ºó£¬load·½·¨±»µ÷ÓÃÒÔˢе±Ç°ÁªÏµÈËÁÐ±í¡£

HTML

ÈçÏÂËùʾµÄÊÇÒ³ÃæÖ÷Ì岿·Ö°üº¬µÄHTML£¬ViewModelµÄÏà¹Ø³ÉÔ±»á°ó¶¨µ½ÏàÓ¦HTMLÔªËØÉÏ¡£Õû¸öÄÚÈÝ´óÌå°üº¬Á½¸ö²¿·Ö£¬µÚÒ»²¿·ÖÓÃÓÚ³ÊÏÖµ±Ç°ÁªÏµÈËÁÐ±í£¬µÚ¶þ²¿·ÖÔÚÓÃÓÚ¶¨Ò嵯³öµÄ¶Ô»°¿ò¡£

1: <!--µ±Ç°ÁªÏµÈËÁбí-->
2: <div id="content">
3: <table class="table table-striped">
4: <thead>
5: <tr>
6: <th>ÐÕÃû</th>
7: <th>ÁªÏµµç»°</th>
8: <th>µç×ÓÓʼþ</th>
9: <th></th>
10: </tr>
11: </thead>
12: <tbody data-bind="foreach: contacts">
13: <tr>
14: <td data-bind="text: Name"></td>
15: <td data-bind="text: PhoneNo"></td>
16: <td data-bind="text: EmailAddress"></td>
17: <td>
18: <a href="#" data-bind= "click: $root.showDialog"> ÐÞ¸Ä</a>
19: <a href= "#" data-bind= "click: $root.delete">ɾ³ý</a>
20: </td>
21: </tr>
22: </tbody>
23: </table>
24: <a href="#" class ="btn btn-primary" data-bind= "click: showDialog"> Ìí¼ÓÐÂÁªÏµÈË</a>
25: </div>
26:
27: <!--Ìí¼Ó/ÐÞ¸ÄÁªÏµÈ˶Ի°¿ò-->
28: <div class="modal fade">
29: <div class="modal-dialog">
30: <div class="modal-content">
31: <div class="modal-header">
32: <button type="button" class="close" data-dismiss= "modal" aria-hidden= "true">& times;</button>
33: <h4 class=" modal-title"> ±à¼­ÁªÏµÈËÐÅÏ¢</h4>
34: </div>
35: <div class=" modal-body form-horizontal " data-bind=" with: contact">
36: <div class="form-group">
37: <label for="name" class="col-sm-2 control-label">ÐÕÃû:</label>
38: <div class="col-sm-10">
39: <input type="text" class="form-control" id="name" placeholder="ÐÕÃû" data-bind=" value:Name">
40: </div>
41: </div>
42: <div class= "form-group">
43: <label for= "phoneNo" class="col-sm-2 control-label"> ÁªÏµµç»°:</label>
44: <div class="col-sm-10">
45: <input type="text" class="form-control" id="phoneNo" placeholder="ÁªÏµµç»°" data-bind=" value:PhoneNo">
46: </div>
47: </div>
48: <div class=" form-group">
49: <label for=" emailAddress" class=" col-sm-2 control-label"> µç×ÓÓÊÏä:</label>
50: <div class= "col-sm-10">
51: <input type= "text" class=" form-control" id="emailAddress" placeholder=" µç×ÓÓÊÏä" data-bind=" value:EmailAddress" >
52: </div>
53: </div>
54: <div class= "form-group">
55: <label for="address" class="col-sm-2 control-label"> µØÖ·:</label>
56: <div class= "col-sm-10">
57: <input type= "text" class="form-control" id="address" placeholder="µØÖ·" data-bind= " value:Address">
58: </div>
59: </div>
60: </div>
61: <div class="modal-footer">
62: <a href= "#" class=" btn btn-default" data-dismiss= "modal"> ¹Ø±Õ</a>
63: < a href="#" class="btn btn-primary" data-bind= "click: save"> ±£´æ</a>
64: </div>
65: </div>
66: </div>
67: </div>

µÚÒ»²¿·ÖµÄºËÐÄÊdzÊÏÖÁªÏµÈËÁбíµÄ<table>ÔªËØ£¬ÆäÖ÷Ìå¾ßÓÐÒ»¸öÕë¶Ôcontacts³ÉÔ±µÄforeach°ó¶¨£¨<tbody data-bind="foreach: contacts">£©£¬¸Ã°ó¶¨ÀûÓÃÄÚǶµÄ<tr>ÔªËØ°ó¶¨ÁбíÖеÄÿ¸öÁªÏµÈË¡£ÖÁÓÚÁªÏµÈ˵ľßÌåij¸öÊôÐÔ£¬Ôò¶ÔÓ¦×ÅÏàÓ¦µÄ<td>ÔªËØ£¬Á½ÕßÖ®¼äÊÇÒ»¸ötext°ó¶¨£¨<td data-bind="text: Name"></td>£©¡£

±í¸ñÖеÄÿÐÐÓÒ²àµÄ¡°Ð޸ġ±ºÍ¡°É¾³ý¡±Á´½Ó¸÷×Ô¾ßÓÐÒ»¸öÕë¶ÔshowDialog ºÍdelete·½·¨³ÉÔ±µÄclick°ó¶¨£¨<a href="#" data-bind="click: $root.showDialog">ÐÞ¸Ä</a>£©¡£Ö®ËùÒÔÐèÒªÔÚ³ÉÔ±Ãû³ÆÇ°ÃæÌí¼Ó¡°$root¡±Ç°×º£¬ÊÇÒòΪKO×ÜÊÇ»á´Óµ±Ç°°ó¶¨ÉÏÏÂÎÄÖÐÈ¥»ñÈ¡°ó¶¨µÄ³ÉÔ±¡£ÓÉÓÚÕâÁ½¸öÁ´½ÓHTMLÄÚǶÓÚforeach°ó¶¨Ö®ÖУ¬ËùÒÔµ±Ç°°ó¶¨ÉÏÏÂÎÄʵ¼ÊÉÏÊÇcontactsÊôÐÔÖÐij¸öÁªÏµÈ˶ÔÏ󡣡°$root¡±Ç°×ºµÄÄ¿µÄÔÚÓÚ¸æËßKO°ó¶¨µÄÊÇViewModel×ÔÉíµÄ³ÉÔ±¡£ÖµµÃÒ»ÌáµÄÊÇ£¬µ±°ó¶¨µÄ·½·¨±»Ö´ÐÐʱ£¬KO»á½«µ±Ç°°ó¶¨ÉÏÏÂÎÄ×÷Ϊ²ÎÊý¡£

ÔÚ±íʾ¡°±à¼­ÁªÏµÈËÐÅÏ¢¡±¶Ô»°¿òµÄÖ÷Ì岿·Ö£¬ÎÒÃÇͨ¹ýÒ»¸öwith°ó¶¨£¨<div data-bind="with: contact">£©½«°ó¶¨ÉÏÏÂÎÄÉ趨ΪViewModelµÄcontactÊôÐÔ£¬ÄÚǶÆäÖеÄ4¸öÎı¾¿ò·Ö±ðÀûÓÃÒ»¸övalue°ó¶¨£¨±ÈÈç<input type="text" data-bind="value:Name">£©Óë¶ÔÓ¦µÄ³ÉÔ±½øÐйØÁª¡£ViewModelÖÐ×îÖÕÓÃÓÚÌí¼Ó/ÐÞ¸ÄÁªÏµÈ˵ķ½·¨saveÔòͨ¹ýÒ»¸öclick°ó¶¨£¨<Èýdata-bind="click: save">±£´æ</a>£©Óë¡°±£´æ¡±°´Å¥¹ØÁªÔÚÒ»Æð¡£

   
5214 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì