±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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>£©Óë¡°±£´æ¡±°´Å¥¹ØÁªÔÚÒ»Æð¡£ |