UWP 律師查詢 MVVM

来源:http://www.cnblogs.com/ZXdeveloper/archive/2017/01/06/6257801.html
-Advertisement-
Play Games

APP簡介 律師查詢是基於聚合數據的律師查詢介面做的,這個介面目前處於停用狀態,但是,由於我是之前申請的,所以,還可以用,應該是無法再申請了。 效果圖 開發 一、HttpHelper 既然是請求介面的,那就少不了請求方式,這裡是比較常用的HttpClient,用起來也比較方便,單獨封裝一個HttpH ...


APP簡介

  律師查詢是基於聚合數據的律師查詢介面做的,這個介面目前處於停用狀態,但是,由於我是之前申請的,所以,還可以用,應該是無法再申請了

效果圖

開發

一、HttpHelper

  既然是請求介面的,那就少不了請求方式,這裡是比較常用的HttpClient,用起來也比較方便,單獨封裝一個HttpHelper類,專門用來作為基礎的連接用

public static class BaseService
    {
        /// <summary>
        /// 訪問伺服器時的Cookies
        /// </summary>
        public static CookieContainer CookiesContainer;
        /// <summary>
        /// 向伺服器發送GET請求 返回伺服器回覆的數據
        /// </summary>
        /// <param name="url">地址</param>
        /// <returns></returns>
        public async static Task<string> SendGetRequest(string url)
        {
            try
            {
                HttpClient client = new HttpClient();
                HttpResponseMessage response = await client.GetAsync(new Uri(url));
                response.EnsureSuccessStatusCode();
                return await response.Content.ReadAsStringAsync();
            }
            catch (Exception ex)
            {
                return null;
                throw(ex);
            }
        }
        /// <summary>
        /// 向伺服器發送POST請求,返回伺服器回覆數據
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="body">報文體</param>
        /// <returns></returns>
        public async static Task<string> SendPostRequest(string url,string body)
        {
            try
            {
                HttpClient client = new HttpClient();
                HttpResponseMessage response = await client.PostAsync(new Uri(url), new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("", body) }));
                response.EnsureSuccessStatusCode();
                return await response.Content.ReadAsStringAsync();
            }
            catch (Exception ex)
            {
                return null;
                throw(ex);
            }
        }
    }
BaseService

  網路請求肯定用非同步請求,UWP里比較常用的就是async、await模式,很方便,因為,介面的返回結果用的是Json形式,所以,Newtonsoft.Json來處理序列化和反序列化。

/// <summary>
    /// Json返回結果
    ///說明:必須要重寫ErrorMess,否則沒有錯誤返回消息
    /// </summary>
    public abstract class ResultInfoHelper
    {
        /// <summary>
        /// 傳入URL和參數,解析返回Json信息,並返回結果
        /// </summary>
        /// <typeparam name="T">參數類型</typeparam>
        /// <param name="_url">URl地址</param>
        /// <param name="args">相關參數</param>
        /// <returns></returns>
        public async Task<T> GetResultInfoGetHelper<T>(string _url,params object[] args)
        {
            string url = string.Format(_url, args);
            string resultUrl = await BaseService.SendGetRequest(url);
            ErrorMess<T>(resultUrl);
            T resultList = JsonConvert.DeserializeObject<T>(resultUrl);
            return resultList;
        }
        /// <summary>
        /// 傳入URL和Body,解析返回Json信息,並返回結果
        /// </summary>
        /// <typeparam name="T">參數類型</typeparam>
        /// <param name="_url">URL地址</param>
        /// <param name="body">傳入Body</param>
        /// <returns></returns>
        public async Task<T> GetResultInfoPostHelper<T>(string _url,string body)
        {
            string resultUrl = await BaseService.SendPostRequest(_url, body);
            ErrorMess<T>(resultUrl);
            T resultList = JsonConvert.DeserializeObject<T>(resultUrl);
            return resultList;
        }
        /// <summary>
        /// 錯誤信息
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="resultUrl"></param>
        protected abstract void ErrorMess<T>(string resultUrl);
        
    }
ResultInfoHelper

  此處用Abstract,是為了以後其他項目也可以使用這個HttpHelper,重寫ErrorMess方便不同的項目拋出不同的錯誤。

  用params object[] args作為參數的好處是,可以不限定參數的類型和個數。

二、SearchLawyer.UWP

1、根據介面返回,設計實體類

  律師查詢介面的返回都是類似於以上這種形式,就是reason、result、error_code,既然,有統一的規律,那就非常容易建立實體類了,創建一個Info<T>。

Info<T>為所有返回的總體樣式,通過傳入不同的T類型,來保證result是不同類型的泛型集合,這樣,接收返回數據時就很方便了,例如Info<Lawyer>

2、請求介面

  寫一個GetInfoHelper<M>繼承ResultInfoHelper,重寫ErrorMess方法

public class GetInfoHelper<M> : ResultInfoHelper
    {
        /// <summary>
        /// 重寫錯誤方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="resultUrl"></param>
        protected override async void ErrorMess<T>(string resultUrl)
        {
            if (typeof(T).Name==typeof(Info<M>).Name)
            {
                Info<M> error = JsonConvert.DeserializeObject<Info<M>>(resultUrl);
                if (error.error_code != 0)
                {
                    await (new MessageDialog("錯誤代碼:" + error.error_code + "\r\n" + "錯誤信息:" + Constant.ConstantValue.Error[error.error_code])).ShowAsync();
                    return;
                }
            }
        }
    }
GetInfoHelper

  此處,需要判別typeof(T)和typeof(Info<M>)是不是同一個類型,如果是同一個類型,才能進行下麵的操作

這麼做的原因,是為了不同的返回類型設計的,而不需要寫多個方法

3、寫View頁面

  因為頁面要麼是律師查詢,要麼是辯詞查詢,所以,頁面顯示的內容格式是一樣的,為了不進行重覆工作,需要給ListView寫一個統一的ItemTemplate(寫在樣式文件里),如果樣式用Binding是沒有問題的,但是如果用x:Bind就會出錯,但是微軟給出了x:Bind要比Binding效率高,所以,咱也不能繞過這個問題,解決花了有小半天時間,給解決了。大家可以參考我這篇帖子x:bind不支持樣式文件 或 此Xaml文件必須又代碼隱藏類才能使用{x:Bind} 解決辦法

4、寫ViewModel頁面

  由於不涉及到什麼複雜的業務邏輯判別,所以VM頁面也是蠻簡單的,根據不用的按鈕,調用不同的請求

  需要註意的是,由於UWP里是沒有x:static的,所以,如果將枚舉作為參數傳遞的話,必須使用如下寫法,這樣才能獲取到參數值,否則,VM頁面接收到的始終是枚舉的第一個

<Button Content="查詢" Command="{Binding SearchCommand}">
  <Button.CommandParameter>
    <constant:Method>LawyerByProvince</constant:Method>
  </Button.CommandParameter>
</Button>

  為了實現向下滑動,動態刷新列表,也就是繼續請求數據,類需要繼承ObservableCollection<Lawyer>和 ISupportIncrementalLoading,這個我是參見周見智大神的【完全開源】博客園客戶端UWP版 帶源碼、帶APP(下篇)里的方法,但是發現一個問題,如果我的返回個數少的話,出了顯示結果,還會彈出一個沒有查詢到數據的錯誤提示,跟蹤代碼發現這個方法會請求兩次,因此,做了寫修改,就是判斷得到的數量是否小於設置的返回條數,如果是的話,就把HasMoreItems設置成false,防止再次請求。

總結

  代碼方面沒什麼難度,看過微軟提供的那個開發視頻,基本都能上手UWP開發,不過,由於一直做WPF,做個UWP練練手,發現,不一樣的地方還是挺多的,話說回來,開發UWP還是挺有意思的,開發過程中學到了不少東西,真的是有些東西看起來容易,實現起來真心不一定容易。

  希望,能有越來越多的開發者重視UWP開發,能讓這個生態圈好起來。

源碼已放GitHub

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • border-radius 屬性設置邊框的園角 可能的值:像素,百分比 擴展延伸 html代碼 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 css代碼 結果 ...
  • 函數本身就是一段JavaScript代碼,定義一次但可能被調用任意次。如果函數掛載在一個對象上,作為對象的一個屬性,通常這種函數被稱作對象的方法。用於初始化一個新創建的對象的函數被稱作構造函數。 相對於其他面向對象語言,在JavaScript中的函數是特殊的,函數即是對象。JavaScript可以把 ...
  • 該文為閱讀高級程式設計(第三本)p144-p164的理解與總結! 接受指導與批評。 對於我,我一直是使用字面量的方式創建對象,然而體繫上的創建對象的方法卻並不局限於此。 創建對象的方法 1 工廠模式: 定義工廠函數創建並返回包含特定屬性的對象, 2 構造函數模式: 先貼出代碼 2.1 new Per ...
  • 本系列將從以下三個方面對Tinker進行源碼解析: 轉載請標明本文來源:http://www.cnblogs.com/yyangblog/p/6252855.html更多內容歡迎star作者的github:https://github.com/LaurenceYang/article如果發現本文有什 ...
  • 地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E6467914871AB8802 https://dl-ssl.google.com/android/re ...
  • service—Android的四大組件之一。人稱“後臺服務”指其本身的運行並不依賴於用戶可視的UI界面 實際開發中我們經常需要service和activity之間可以相互傳遞數據維持程式的運行。 先瞭解Service的生命周期吧。 新建一個類繼Service: 新建以上類並繼承Service後只會 ...
  • Android Butterknife 8.4.0 使用方法總結 ...
  • Android SDK版本號 與 API Level 對應關係如下表: Code nameVersionAPI level (no code name) 1.0 API level 1 (no code name) 1.1 API level 2 2008 年9月發佈的Android第一版 Cupc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...