NopCommerce 3.4省市联动

做法有两种,一种是在StateProvince表里面加个字段,另一种是新建两个表,用来存市、县的数据,表结构完全按照StateProvince走就好了。我这里用的是第二种做法,菜鸟一枚,代码写的比较烂,哪里写的不好欢迎提出来以便我提高自己。

第一步:去数据库,新建两个表,表我就不给了,直接给对应的Model

 1 using System.Collections.Generic;
 2 using Nop.Core.Domain.Localization;
 3
 4 namespace Nop.Core.Domain.Directory
 5 {
 6     /// <summary>
 7     /// Represents a state/province
 8     /// </summary>
 9     public partial class City : BaseEntity, ILocalizedEntity
10     {
11         private ICollection<County> _counties;
12         /// <summary>
13         /// Gets or sets the country identifier
14         /// </summary>
15         public int StateProvinceId { get; set; }
16
17         /// <summary>
18         /// Gets or sets the name
19         /// </summary>
20         public string Name { get; set; }
21
22         /// <summary>
23         /// Gets or sets the abbreviation
24         /// </summary>
25         public string Abbreviation { get; set; }
26
27         /// <summary>
28         /// Gets or sets a value indicating whether the entity is published
29         /// </summary>
30         public bool Published { get; set; }
31
32         /// <summary>
33         /// Gets or sets the display order
34         /// </summary>
35         public int DisplayOrder { get; set; }
36
37         /// <summary>
38         /// Gets or sets the country
39         /// </summary>
40         public virtual StateProvince StateProvince { get; set; }
41         public virtual ICollection<County> Countys
42         {
43             get { return _counties ?? (_counties = new List<County>()); }
44             protected set { _counties = value; }
45         }
46     }
47
48 }

City.cs

 1 using Nop.Core.Domain.Localization;
 2
 3 namespace Nop.Core.Domain.Directory
 4 {
 5     /// <summary>
 6     /// Represents a state/province
 7     /// </summary>
 8     public partial class County : BaseEntity, ILocalizedEntity
 9     {
10         /// <summary>
11         /// Gets or sets the country identifier
12         /// </summary>
13         public int CityId { get; set; }
14
15         /// <summary>
16         /// Gets or sets the name
17         /// </summary>
18         public string Name { get; set; }
19
20         /// <summary>
21         /// Gets or sets the abbreviation
22         /// </summary>
23         public string Abbreviation { get; set; }
24
25         /// <summary>
26         /// Gets or sets a value indicating whether the entity is published
27         /// </summary>
28         public bool Published { get; set; }
29
30         /// <summary>
31         /// Gets or sets the display order
32         /// </summary>
33         public int DisplayOrder { get; set; }
34
35         /// <summary>
36         /// Gets or sets the country
37         /// </summary>
38         public virtual City City { get; set; }
39     }
40
41 }

County.cs

当然,还需要修改StateProvince的Model

 1 using System.Collections.Generic;
 2 using Nop.Core.Domain.Localization;
 3
 4 namespace Nop.Core.Domain.Directory
 5 {
 6     /// <summary>
 7     /// Represents a state/province
 8     /// </summary>
 9     public partial class StateProvince : BaseEntity, ILocalizedEntity
10     {
11         private ICollection<City> _cities;
12         /// <summary>
13         /// Gets or sets the country identifier
14         /// </summary>
15         public int CountryId { get; set; }
16
17         /// <summary>
18         /// Gets or sets the name
19         /// </summary>
20         public string Name { get; set; }
21
22         /// <summary>
23         /// Gets or sets the abbreviation
24         /// </summary>
25         public string Abbreviation { get; set; }
26
27         /// <summary>
28         /// Gets or sets a value indicating whether the entity is published
29         /// </summary>
30         public bool Published { get; set; }
31
32         /// <summary>
33         /// Gets or sets the display order
34         /// </summary>
35         public int DisplayOrder { get; set; }
36
37         /// <summary>
38         /// Gets or sets the country
39         /// </summary>
40         public virtual Country Country { get; set; }
41         public virtual ICollection<City> Citys
42         {
43             get { return _cities ?? (_cities = new List<City>()); }
44             protected set { _cities = value; }
45         }
46     }
47
48 }

StateProvince.cs

第二步:去Service层去做Crud,县、市的基本是一样的,我就只列出来一个。另外一个照着写就完了。

先定义接口:

 1 using System.Collections.Generic;
 2 using Nop.Core.Domain.Directory;
 3
 4 namespace Nop.Services.Directory
 5 {
 6     public interface ICityService
 7     {
 8         void DeleteCity(City city);
 9         City GetCityById(int cityId);
10         City GetByAbbreviation(string abbreviation);
11         IList<City> GetCityByStateProvinceId(int stateProvinceId, bool showHidden = false);
12         void InsertCity(City city);
13         void UpdateCity(City city);
14     }
15 }

ICityService.cs

去实现接口:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using Nop.Core.Caching;
  5 using Nop.Core.Data;
  6 using Nop.Core.Domain.Directory;
  7 using Nop.Services.Events;
  8
  9 namespace Nop.Services.Directory
 10 {
 11     public  partial class CityService:ICityService
 12     {
 13         #region Constants
 14
 15         /// <summary>
 16         /// Key for caching
 17         /// </summary>
 18         /// <remarks>
 19         /// {1} : country ID
 20         /// </remarks>
 21         private const string CITYS_ALL_KEY = "Nop.city.all-{0}";
 22         /// <summary>
 23         /// Key pattern to clear cache
 24         /// </summary>
 25         private const string CITYS_PATTERN_KEY = "Nop.city.";
 26
 27         #endregion
 28
 29         #region Fields
 30
 31         private readonly IRepository<City> _cityRepository;
 32         private readonly IEventPublisher _eventPublisher;
 33         private readonly ICacheManager _cacheManager;
 34
 35         #endregion
 36
 37         #region Ctor
 38
 39         /// <summary>
 40         /// Ctor
 41         /// </summary>
 42         /// <param name="cacheManager">Cache manager</param>
 43         /// <param name="stateProvinceRepository">State/province repository</param>
 44         /// <param name="eventPublisher">Event published</param>
 45         public CityService(ICacheManager cacheManager,
 46             IRepository<City> cityRepository,
 47             IEventPublisher eventPublisher)
 48         {
 49             _cacheManager = cacheManager;
 50             _cityRepository = cityRepository;
 51             _eventPublisher = eventPublisher;
 52         }
 53
 54         #endregion
 55         public void DeleteCity(City city)
 56         {
 57             if(city==null)
 58                 throw new ArgumentNullException("city");
 59             _cityRepository.Delete(city);
 60             _cacheManager.RemoveByPattern(CITYS_PATTERN_KEY);
 61             _eventPublisher.EntityDeleted(city);
 62         }
 63
 64         public City GetCityById(int cityId)
 65         {
 66             if (cityId == 0)
 67             {
 68                 return null;
 69             }
 70             return _cityRepository.GetById(cityId);
 71         }
 72
 73         public City GetByAbbreviation(string abbreviation)
 74         {
 75             var query = from sp in _cityRepository.Table
 76                 where sp.Abbreviation == abbreviation
 77                 select sp;
 78             var city = query.FirstOrDefault();
 79             return city;
 80         }
 81
 82         public IList<City> GetCityByStateProvinceId(int stateProvinceId, bool showHidden = false)
 83         {
 84             string key = string.Format(CITYS_ALL_KEY, stateProvinceId);
 85             return _cacheManager.Get(key, () =>
 86             {
 87                 var query= from sp in _cityRepository.Table
 88                                  orderby  sp.DisplayOrder
 89                            where sp.StateProvinceId == stateProvinceId &&
 90                        (showHidden || sp.Published)
 91                            select sp;
 92                 var city = query.ToList();
 93                 return city;
 94             });
 95         }
 96
 97         public void InsertCity(City city)
 98         {
 99             if (city == null)
100                 throw new ArgumentNullException("city");
101
102             _cityRepository.Insert(city);
103
104             _cacheManager.RemoveByPattern(CITYS_PATTERN_KEY);
105
106             //event notification
107             _eventPublisher.EntityInserted(city);
108         }
109
110         public void UpdateCity(City city)
111         {
112             if (city == null)
113                 throw new ArgumentNullException("city");
114
115             _cityRepository.Update(city);
116
117             _cacheManager.RemoveByPattern(CITYS_PATTERN_KEY);
118
119             //event notification
120             _eventPublisher.EntityUpdated(city);
121         }
122     }
123 }

CityService.cs

这是市的,县的照着这个写就完了。注意缓存那块也一定要给把那个Key给改了,不然会重名的。

第三步:去Nop.Web.Framework把刚写的这些Service注入。

1  builder.RegisterType<CityService>().As<ICityService>().SingleInstance();
2             builder.RegisterType<CountyService>().As<ICountyService>().SingleInstance();

DependencyRegistrar.cs

第三步:修改他转换po和vo的方法,我这个做的是国内的电子商务网站,所以,国家那里我直接就写死了,而且在后续的界面中,我也直接把国家给干掉了。

  1 public static void PrepareModel(this AddressModel model,
  2             Address address, bool excludeProperties,
  3             AddressSettings addressSettings,
  4             ILocalizationService localizationService = null,
  5             IStateProvinceService stateProvinceService = null,
  6               #region yunchen.bai
  7          ICityService cityService=null,
  8             ICountyService countyService=null ,
  9     #endregion
 10             Func<IList<Country>> loadCountries = null,
 11             bool prePopulateWithCustomerFields = false,
 12             Customer customer = null
 13
 14             )
 15         {
 16             if (model == null)
 17                 throw new ArgumentNullException("model");
 18
 19             if (addressSettings == null)
 20                 throw new ArgumentNullException("addressSettings");
 21
 22             if (!excludeProperties && address != null)
 23             {
 24                 model.Id = address.Id;
 25                 model.FirstName = address.FirstName;
 26                 model.LastName = address.LastName;
 27                 model.Email = address.Email;
 28                 model.Company = address.Company;
 29                 model.CountryId = address.CountryId;
 30                 model.CountryName = address.Country != null
 31                     ? address.Country.GetLocalized(x => x.Name)
 32                     : null;
 33                 model.StateProvinceId = address.StateProvinceId;
 34                 model.StateProvinceName = address.StateProvince != null
 35                     ? address.StateProvince.GetLocalized(x => x.Name)
 36                     : null;
 37                 model.City = address.City;
 38                 model.Address1 = address.Address1;
 39                 model.Address2 = address.Address2;
 40                 model.ZipPostalCode = address.ZipPostalCode;
 41                 model.PhoneNumber = address.PhoneNumber;
 42                 model.FaxNumber = address.FaxNumber;
 43             }
 44
 45             if (address == null && prePopulateWithCustomerFields)
 46             {
 47                 if (customer == null)
 48                     throw new Exception("Customer cannot be null when prepopulating an address");
 49                 model.Email = customer.Email;
 50                 model.FirstName = customer.GetAttribute<string>(SystemCustomerAttributeNames.FirstName);
 51                 model.LastName = customer.GetAttribute<string>(SystemCustomerAttributeNames.LastName);
 52                 model.Company = customer.GetAttribute<string>(SystemCustomerAttributeNames.Company);
 53                 model.Address1 = customer.GetAttribute<string>(SystemCustomerAttributeNames.StreetAddress);
 54                 model.Address2 = customer.GetAttribute<string>(SystemCustomerAttributeNames.StreetAddress2);
 55                 model.ZipPostalCode = customer.GetAttribute<string>(SystemCustomerAttributeNames.ZipPostalCode);
 56                 model.City = customer.GetAttribute<string>(SystemCustomerAttributeNames.City);
 57                 //ignore country and state for prepopulation. it can cause some issues when posting pack with errors, etc
 58                 //model.CountryId = customer.GetAttribute<int>(SystemCustomerAttributeNames.CountryId);
 59                 //model.StateProvinceId = customer.GetAttribute<int>(SystemCustomerAttributeNames.StateProvinceId);
 60                 model.PhoneNumber = customer.GetAttribute<string>(SystemCustomerAttributeNames.Phone);
 61                 model.FaxNumber = customer.GetAttribute<string>(SystemCustomerAttributeNames.Fax);
 62             }
 63
 64             //countries and states
 65             if (addressSettings.CountryEnabled && loadCountries != null)
 66             {
 67                 if (localizationService == null)
 68                     throw new ArgumentNullException("localizationService");
 69
 70                 model.AvailableCountries.Add(new SelectListItem() { Text = localizationService.GetResource("Address.SelectCountry"), Value = "0" });
 71                 foreach (var c in loadCountries())
 72                 {
 73                     model.AvailableCountries.Add(new SelectListItem()
 74                     {
 75                         Text = c.GetLocalized(x => x.Name),
 76                         Value = c.Id.ToString(),
 77                         Selected = c.Id == model.CountryId
 78                     });
 79                 }
 80                 model.CountryId = 21;
 81                 if (address != null)
 82                 {
 83                     model.CountyId = address.CountyId;
 84                     model.CityId = address.CityId;
 85                 }
 86                 if (addressSettings.StateProvinceEnabled)
 87                 {
 88                     //states
 89                     if (stateProvinceService == null)
 90                         throw new ArgumentNullException("stateProvinceService");
 91
 92                     var states = stateProvinceService
 93                         .GetStateProvincesByCountryId(21)//这块直接给写死成中国
 94                         .ToList();
 95                     if (states.Count > 0)
 96                     {
 97                         foreach (var s in states)
 98                         {
 99                             model.AvailableStates.Add(new SelectListItem()
100                             {
101                                 Text = s.GetLocalized(x => x.Name),
102                                 Value = s.Id.ToString(),
103                                 Selected = (s.Id == model.StateProvinceId)
104                             });
105                         }
106                     }
107                     else
108                     {
109                         model.AvailableStates.Add(new SelectListItem()
110                         {
111                             Text = localizationService.GetResource("Address.OtherNonUS"),
112                             Value = "0"
113                         });
114                     }
115                     #region yunchen.bai 2014.10.27
116                     if (cityService == null)
117                         throw new ArgumentNullException("cityService");
118                     var firstProvince = stateProvinceService.GetStateProvincesByCountryId(21).FirstOrDefault() ??
119                                         new StateProvince();
120                     var citys =
121                         cityService.GetCityByStateProvinceId(model.StateProvinceId != null
122                             ? model.StateProvinceId.Value
123                             : firstProvince.Id).ToList();
124                     var firstCity = cityService.GetCityByStateProvinceId(firstProvince.Id).FirstOrDefault() ??
125                                      new City();
126                     if (citys.Count > 0)
127                     {
128                         foreach (var c in citys)
129                         {
130                            model.AvailableCity.Add(new SelectListItem()
131                            {
132                                Text = c.GetLocalized(x=>x.Name),
133                                Value = c.Id.ToString(),
134                                Selected = (c.Id==model.CityId)
135                            });
136                         }
137                     }
138                     else
139                     {
140                         model.AvailableCity.Add(new SelectListItem()
141                         {
142                             Text = localizationService.GetResource("Address.OtherNonUS"),
143                             Value = "0"
144                         });
145                     }
146                     if(countyService==null)
147                         throw  new ArgumentNullException("countyService");
148                     var counties = countyService.GetCountyByCityId(model.CityId.HasValue?model.CityId.Value:firstCity.Id);
149                     if (counties.Count > 0)
150                     {
151                         foreach (var county in counties)
152                         {
153                             model.AvailableCounty.Add(new SelectListItem()
154                             {
155                                 Text = county.GetLocalized(x=>x.Name),
156                                 Value = county.Id.ToString(),
157                                 Selected = (county.Id==model.CityId)
158                             });
159                         }
160                     }
161                     else
162                     {
163                         model.AvailableCity.Add(new SelectListItem()
164                         {
165                             Text = localizationService.GetResource("Address.OtherNonUS"),
166                             Value = "0"
167                         });
168                     }
169
170                     #endregion
171
172
173                 }
174             }

MappingExtensions.cs

未完待续.....

时间: 2024-08-27 11:10:59

NopCommerce 3.4省市联动的相关文章

自建List&lt;&gt;绑定ComboBox下拉框实现省市联动

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace _04省市联动 { public partial cl

php省市联动实现

设计模式:ajax实现,数据库格式:id,name,parent_id 数据库: CREATE TABLE IF NOT EXISTS `city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREME

fragment 中利用spinner实现省市联动

(1)布局文件就不在说明了,主要说代码的实现,先把代码贴上! package com.example.cl; import android.annotation.SuppressLint; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import

省市联动 js

工作中见到这个省市联动代码,虽然很简单也能写出来,还是随便把它记录下来. //省市联动 function area(obj_id, area_pId, data_call_back) { if (area_pId == -1) return; $.ajax({ type: 'GET', url: "/SysAdmin/Pages/tb_supplierAdd.aspx", data: { area_pId: area_pId }, dataType: 'json', success:

jquery插件-省市联动

由于项目需要需要实现一个省市联动,由于业务有一些特殊的需求,使用现有的插件略有不便,就自己实现了一个. 首先需要保存地区数据的JS数据文件,我这里命名为areaData.js,内容如下: /** * 保存地区信息 * 数据格式 * areaData = [{'pro': '北京', 'cities': {'-1': '北京'}}, {...}] * 直辖市存在-1,表示就是直辖市 */ (function(window) { window.areaData = [{"pro":&quo

几个数据库的小案例(二):极其简单的省市联动

总用有两个文件(frmMain.cs SqlHelper.cs) //frmMain.cs//作者:Meusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 省市联动

Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)

我们经常要实现类似省市联动一样的功能,常见的就是二个查找控件,一个选择了省后,另一个市的查找控件就自动过滤了,只显示当前省下的市,而不是所有的市.当然这是最简单的,实际工作中还有更复杂的功能要通过过滤查找控件来实现.本文主要介绍基本的查找控件过滤.多表关联的复杂过滤以及子表里实现查找控件的过滤.   一.简单的过滤 先看下需求: 按"Special GL Indicator" 来过滤 Posting 查找控件增加了preSearch事件.它发生在查找控件显示对话框供用户查找记录之前,与

AJAX案例四:省市联动

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 4 5 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4

Json 基于jQuery+JSON的省市联动效果

helloweba.com 作者:月光光 时间:2012-09-12 21:57 标签: jQuery  JSON  Ajax  省市联动 省市区联动下拉效果在WEB中应用非常广泛,尤其在一些会员信息系统.电商网站最为常见.开发者一般使用Ajax实现无刷新下拉联动.本文将讲述,利用jQuery插件,通过读取JSON数据,实现无刷新动态下拉省市二(三)级联动效果. 查看演示 下载源码 HTML 首先在head中载入jquery库和cityselect插件. <script type="tex