1. 程式人生 > >基於MVC4+EasyUI的Web開發框架經驗總結(7)--實現省份、城市、行政區三者聯動

基於MVC4+EasyUI的Web開發框架經驗總結(7)--實現省份、城市、行政區三者聯動

為了提高客戶體驗和進行一些技術探索,現在正準備把我自己的客戶關係管理系統CRM在做一個Web的版本,因此對基於MVC的Web介面繼續進行一些研究和優化,力求在功能和介面上保持和Winform一致,本文主要介紹在我的CRM系統中用到的全國省份、城市、行政區三者的兩種效果,在Winform上實現沒問題,在Web上基於MVC的EasyUI實現,同樣也沒有問題。

1、Winform上省份、城市、行政區的聯動效果

裡面主要通過對控制元件本身選擇的事件進行處理,然後動態獲取不同的資料進行展示,大致的邏輯就是先初始化省份資料,然後省份控制元件選擇時觸發獲取該省份下的城市資訊,城市控制元件選擇的時候觸發獲取該城市的行政區資料,大概的程式碼如下所示。

        private void txtProvince_SelectedIndexChanged(object sender, EventArgs e)
        {
            CListItem item = this.txtProvince.SelectedItem as CListItem;
            if (item != null)
            {
                string provinceId = item.Value;
                this.txtCity.Properties.BeginUpdate();
                
this.txtCity.Properties.Items.Clear(); List<CityInfo> cityList = BLLFactory<City>.Instance.GetCitysByProvinceID(provinceId); foreach (CityInfo info in cityList) { this.txtCity.Properties.Items.Add(new CListItem(info.CityName, info.ID.ToString())); }
this.txtCity.Properties.EndUpdate(); } } private void txtCity_SelectedIndexChanged(object sender, EventArgs e) { CListItem item = this.txtCity.SelectedItem as CListItem; if (item != null) { string cityId = item.Value; this.txtDistrict.Properties.BeginUpdate(); this.txtDistrict.Properties.Items.Clear(); List<DistrictInfo> districtList = BLLFactory<District>.Instance.GetDistrictByCity(cityId); foreach (DistrictInfo info in districtList) { this.txtDistrict.Properties.Items.Add(new CListItem(info.DistrictName, info.ID.ToString())); } this.txtDistrict.Properties.EndUpdate(); } }

2、基於MVC+EasyUI的Web上實現省份、城市、行政區的聯動

有了全國的省份、城市、行政區資料,加上對三者的資料訪問進行了封裝,參考Winform版本的實現過程,當然在EasyUI的Web上實現起來,也是可以的。

我們先來看看實現的效果,然後在分析其中的實現思路和程式碼,基於MVC+EasyUI的實現效果如下所示。

      

上面的效果是如何實現的呢?

1)定義相關的控制器函式,提供Json資料來源

為了實現控制元件的資料繫結,我們第一步需要為這幾個控制元件定義一些控制器的函式,方便獲取相關的資料。其中的CListItem有Text 和 Value兩個屬性,可以用於繫結操作。

        /// <summary>
        /// 獲取所有的省份
        /// </summary>
        /// <returns></returns>
        public ActionResult GetAllProvince()
        {
            List<CListItem> treeList = new List<CListItem>();

            List<ProvinceInfo> provinceList = BLLFactory<Province>.Instance.GetAll();
            foreach (ProvinceInfo info in provinceList)
            {
                treeList.Add(new CListItem(info.ProvinceName, info.ProvinceName));
            }
            return ToJsonContent(treeList);
        }
        /// <summary>
        /// 根據省份名稱獲取對應的城市列表
        /// </summary>
        /// <param name="provinceName">省份名稱</param>
        /// <returns></returns>
        public ActionResult GetCitysByProvinceName(string provinceName)
        {
            List<CListItem> treeList = new List<CListItem>();

            List<CityInfo> cityList = BLLFactory<City>.Instance.GetCitysByProvinceName(provinceName);
            foreach (CityInfo info in cityList)
            {
                treeList.Add(new CListItem(info.CityName, info.CityName));
            }

            return ToJsonContent(treeList);
        }
        /// <summary>
        /// 根據城市名稱獲取對應的行政區劃類別
        /// </summary>
        /// <param name="cityName">城市名稱</param>
        /// <returns></returns>
        public ActionResult GetDistrictByCityName(string cityName)
        {
            List<CListItem> treeList = new List<CListItem>();

            string condition = string.Format("");
            List<DistrictInfo> districtList = BLLFactory<District>.Instance.GetDistrictByCityName(cityName);
            foreach (DistrictInfo info in districtList)
            {
                treeList.Add(new CListItem(info.DistrictName, info.DistrictName));
            }

            return ToJsonContent(treeList);
        }

2)在視圖裡面新增控制元件繫結資料的JS程式碼

為了實現三個ComboBox的控制元件的聯動效果,我們需要使用JS程式碼實現資料的繫結,並繫結控制元件的Change事件,一旦使用者選擇其中一個,那麼可能觸發其他另外一個獲取資料來源。

        //繫結省份、城市、行政區資訊
        function BindProvinceCity() {
            var province = $('#Province').combobox({
                valueField: 'Value', //值欄位
                textField: 'Text', //顯示的欄位
                url: '/Province/GetAllProvince',
                editable: true,
                onChange: function (newValue, oldValue) {
                    $.get('/City/GetCitysByProvinceName', { provinceName: newValue }, function (data) {
                        city.combobox("clear").combobox('loadData', data);
                        district.combobox("clear")
                    }, 'json');
                }
            });

            var city = $('#City').combobox({
                valueField: 'Value', //值欄位
                textField: 'Text', //顯示的欄位
                editable: true,
                onChange: function (newValue, oldValue) {
                    $.get('/District/GetDistrictByCityName', { cityName: newValue }, function (data) {
                        district.combobox("clear").combobox('loadData', data);
                    }, 'json');
                }
            });

            var district = $('#District').combobox({
                valueField: 'Value', //值欄位
                textField: 'Text', //顯示的欄位
                editable: true
            });
        }

然後介面上需要擺放這幾個控制元件。

                        <tr>      
                            <th>
                                <label for="Province">所在省份:</label>
                            </th>
                            <td>
                                <select class="easyui-combobox" id="Province" name="Province"  style="width:120px;"></select> 
                            </td>
                            <th>
                                <label for="City">城市:</label>
                            </th>
                            <td>
                                <select class="easyui-combobox" id="City" name="City"  style="width:120px;"></select> 
                            </td>
                        </tr>
                        <tr>
                            <th>
                                <label for="District">所在行政區:</label>
                            </th>
                            <td>
                                <select class="easyui-combobox" id="District" name="District"  style="width:120px;"></select>
                            </td>
                            <th>
                                <label for="Hometown">籍貫:</label>
                            </th>
                            <td>
                                <select class="easyui-combobox" id="Hometown" name="Hometown"  style="width:120px;"></select>
                            </td>
                        </tr>

OK,我們實現了資料的初始化繫結,一旦使用者選擇了省份資料,那麼對應的城市資料列表也會更新了,選擇城市,那麼行政區也接著更新了,這一切似乎都搞定了?

還沒有,還需要考慮對編輯狀態下的資料賦值,如果實體類的資訊裡面,已經有資料了,那麼繫結控制元件後,是否會正常顯示呢?

3)控制元件內容的繫結

一般情況下,我們通過Ajax操作來獲取控制器的資料,然後繫結到介面控制元件上,如下所示。

            $.getJSON("/Contact/FindByID?id=" + ID, function (info) {
                //賦值有幾種方式:.datebox('setValue', info.Birthday);.combobox('setValue', info.Status);.val(info.Name);.combotree('setValue', info.PID);
                $("#ID").val(info.ID);
                $("#Customer_ID").val(info.Customer_ID);
                $("#HandNo").val(info.HandNo);
                $("#Name").val(info.Name);

                $("#Province").combobox('setValue', info.Province);
                $("#City").combobox('setValue', info.City);
                $("#District").combobox('setValue', info.District);
                $("#Hometown").combobox('setValue', info.Hometown);
                
..................
}); }

如果沒有聯動的效果處理,一般情況下,這種賦值的操作,沒有問題的,但是我發現使用這種方法操作城市和行政區的資料顯示不正常,開始百思不得其解,測試了幾種方法操作,都沒有使得城市、行政區的介面控制元件能夠正常顯示。

原來發現,造成這種問題的原因,可能是使用非同步操作,它們的聯動效果還沒有處理完畢,就執行賦值操作了,導致可能資料無法正常顯示。

因此改用設定為同步的操作,如下紅色程式碼所示,把async設定為false就表示同步,測試後發現這個設定後,介面控制元件能夠正常顯示了,一切都正常,終於解決心頭大患了。

            //使用同步方式,使得聯動的控制元件正常顯示
            $.ajaxSettings.async = false;

            //首先使用者傳送一個非同步請求去後臺實現方法
            $.getJSON("/Contact/FindByID?id=" + ID, function (info) {

以上就是我對於經常用到的全國省份、城市、行政區的Web上的聯動操作的介面效果和實現程式碼,希望給大家提供一個參考的案例,共同提高。

基於MVC4+EasyUI的Web開發框架的系列文章:

相關推薦

基於MVC4+EasyUI的Web開發框架經驗總結7--實現省份城市行政區三者聯動

為了提高客戶體驗和進行一些技術探索,現在正準備把我自己的客戶關係管理系統CRM在做一個Web的版本,因此對基於MVC的Web介面繼續進行一些研究和優化,力求在功能和介面上保持和Winform一致,本文主要介紹在我的CRM系統中用到的全國省份、城市、行政區三者的兩種效果,在Winform上實現沒問題,在Web上

基於MVC4+EasyUI的Web開發框架經驗總結8--實現Office文檔的預覽

討論 off info code .cn viewer 存在 nco app http://www.cnblogs.com/wuhuacong/p/3871991.html 基於MVC4+EasyUI的Web開發框架經驗總結(8)--實現Office文檔的預覽

基於MVC4+EasyUI的Web開發框架經驗總結8--實現Office文件的預覽

在部落格園很多文章裡面,曾經有一些介紹Office文件預覽檢視操作的,有些通過轉為PDF進行檢視,有些通過把它轉換為Flash進行檢視,但是過程都是曲線救國,真正能夠簡潔方便的實現Office文件的預覽的還是比較少,這裡的Office文件包括了Word、Excel、PPT文件。本文介紹兩種方式,一種方式是通過

基於Metronic的Bootstrap開發框架經驗總結9--實現Web頁面內容的列印預覽和儲存操作

在前面介紹了很多篇相關的《Bootstrap開發框架》的系列文章,這些內容基本上覆蓋到了我這個Bootstrap框架的各個主要方面的內容,總體來說基本達到了一個穩定的狀態,隨著時間的推移可以會引入一些更好更新的內容進行完善,本篇繼續這個系列,主要介紹如何實現Web頁面內容的列印預覽和儲存操作。 1、Web頁

基於Metronic的Bootstrap開發框架經驗總結7--資料的匯入匯出及附件的檢視處理

在很多系統模組裡面,我們可能都需要進行一定的資料交換處理,也就是資料的匯入或者匯出操作,這樣的批量處理能給系統使用者更好的操作體驗,也提高了使用者錄入資料的效率。我在較早時期的EasyUI的Web框架上,也介紹過通過Excel進行的資料匯入匯出操作,隨筆文章為《基於MVC4+EasyUI的Web開發框架經驗總

基於Metronic的Bootstrap開發框架經驗總結9--實現Web頁面內容的打印預覽和保存操作

復制 metronic ports 分享 idt details func git 獲取 在前面介紹了很多篇相關的《Bootstrap開發框架》的系列文章,這些內容基本上覆蓋到了我這個Bootstrap框架的各個主要方面的內容,總體來說基本達到了一個穩定的狀態,隨著時間的推

基於MVC4+EasyUI的Web開發框架經驗總結5--使用HTML編輯控件CKEditor和CKFinder

err config 兩個 腳本 web開發 upload asp 正常 初始 http://www.cnblogs.com/wuhuacong/p/3780356.html Web開發上有很多HTML的編輯控件,如CKEditor、kindeditor等等,很多都做的很

基於MVC4+EasyUI的Web開發框架經驗總結2- 使用EasyUI的樹控件構建Web界面

set 應用 get ember trim ase str zab ble http://www.cnblogs.com/wuhuacong/p/3669575.html 最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在用戶體驗和界面設計方面,和Winfor

基於MVC4+EasyUI的Web開發框架經驗總結6--在頁面中應用下拉列表的處理

ica new web開發 don ext images 如果 bob 獲取 http://www.cnblogs.com/wuhuacong/p/3840321.html 在很多Web界面中,我們都可以看到很多下拉列表的元素,有些是固定的,有些是動態的;有些是字典內容,

基於MVC4+EasyUI的Web開發框架經驗總結1-利用jQuery Tags Input 外掛顯示選擇記錄

最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在使用者體驗和介面設計方面,和Winform開發框架保持一致,而在Web上,我主要採用EasyUI的前端介面處理技術,走MVC的技術路線,在重構完善過程中,很多細節花費不少時間進行研究和提煉,一步步走過來,也積累了不

基於MVC4+EasyUI的Web開發框架經驗總結3- 使用Json實體類構建選單資料

最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在使用者體驗和介面設計方面,和Winform開發框架保持一致,而在Web上,我主要採用EasyUI的前端介面處理技術,走MVC的技術路線,在重構完善過程中,很多細節花費不少時間進行研究和提煉,一步步走過來,也積累了不少經驗,本系列將主要介紹我在進一步

基於MVC4+EasyUI的Web開發框架經驗總結13--DataGrid控制元件實現自動適應寬頻高度

在預設情況下,EasyUI的DataGrid好像都沒有具備自動寬度的適應功能,一般是指定畫素寬度的,但是使用的人員計算機的螢幕解析度可能不一樣,因此導致有些地方顯示太大或者太小,總是不能達到好的預期效果,如果DataGrid能夠根據視窗尺寸進行伸縮,效果應該好很多。本文主要介紹DataGrid控制元件實現自動

基於MVC4+EasyUI的Web開發框架經驗總結4--使用圖表控制元件Highcharts

在我們做各種應用的時候,我們可能都會使用到圖表統計,以前接觸過一些不同的圖表控制元件,在無意中發現了圖表控制元件Highcharts,其強大的功能和豐富的互動效果,令人難以忘懷。本篇主要介紹在Web開發中使用圖表控制元件Highcharts,以及對其進行統一漢化等操作,讓我們的程式功能更加豐富,內容更加美觀。

基於MVC4+EasyUI的Web開發框架經驗總結2- 使用EasyUI的樹控制元件構建Web介面

最近花了不少時間在重構和進一步提煉我的Web開發框架上,力求在使用者體驗和介面設計方面,和Winform開發框架保持一致,而在Web上,我主要採用EasyUI的前端介面處理技術,走MVC的技術路線,在重構完善過程中,很多細節花費不少時間進行研究和提煉,一步步走過來,也積累了不少經驗,本系列將主要介紹我在進一步

基於MVC4+EasyUI的Web開發框架經驗總結6--在頁面中應用下拉列表的處理

在很多Web介面中,我們都可以看到很多下拉列表的元素,有些是固定的,有些是動態的;有些是字典內容,有些是其他表裡面的名稱欄位;有時候引用的是外來鍵ID,有時候引用的是名稱文字內容;正確快速使用下拉列表的處理,可以提高我們程式介面的美觀性和友好型,本文主要介紹在我的Web開發框架以及相關的擴充套件Web應用中用

基於MVC4+EasyUI的Web開發框架經驗總結14--自動生成圖示樣式檔案和圖示的選擇操作

在很多Web系統中,一般都可能提供一些圖示的選擇,方便配置按鈕,選單等介面元素的圖示,從而是Web系統介面看起來更加美觀和協調。但是在系統中一般內建的圖示樣式相對比較有限,而且硬編碼寫到樣式表裡面,這樣給我們擴充套件使用有很多的不方便。基於這個原因,我想如果能夠獨立一個模組,自動根據圖示生成圖示CSS樣式檔案

基於MVC4+EasyUI的Web開發框架經驗總結9--在Datagrid裡面實現外來鍵欄位的轉義操作

我們在使用EasyUI的時候,很多情況下需要使用到表格控制元件datagrid,這個控制元件控制元件非常強大,使用起來很簡潔,但是我在使用中,發現對於一個表裡面的外來鍵欄位進行轉義,並顯示引用表的一些名稱的操作,卻顯得比較難以實現,找了很多資料,基本上沒有找到對應的解決方案。本文主要介紹我對這種外來鍵欄位轉義

基於MVC4+EasyUI的Web開發框架經驗總結11--使用Bundles處理簡化頁面程式碼

在Web開發的時候,我們很多時候,需要引用很多CSS檔案、JS檔案,隨著使用更多的外掛或者獨立樣式檔案,可能我們的Web介面程式碼會越來越臃腫,看起來也很累贅,在MVC裡面提供了一個Bundle的物件,用來簡化頁面程式碼非常方便,本文主要介紹在我的MVC框架裡面,如何使用bundles來簡化頁面的程式碼的。

基於MVC4+EasyUI的Web開發框架經驗總結5--使用HTML編輯控制元件CKEditor和CKFinder

Web開發上有很多HTML的編輯控制元件,如CKEditor、kindeditor等等,很多都做的很好,本文主要介紹在MVC介面裡面,CKEditor的配置和使用。CKEditor的前身是FCKEditor,隨著它的更新,上傳圖片的功能被分離出去了,現在如果需要實現上傳圖片,要麼自己寫程式碼或者採用其他上傳控

基於MVC4+EasyUI的Web開發框架經驗總結10--在Web介面上實現資料的匯入和匯出

資料的匯入匯出,在很多系統裡面都比較常見,這個匯入匯出的操作,在Winform裡面比較容易實現,我曾經在之前的一篇文章《Winform開發框架之通用資料匯入匯出操作》介紹了在Winform裡面的通用匯入匯出模組的設計和開發過程,但在Web上我們應該如何實現呢?本文主要介紹利用MVC4+EasyUI的特點,並結