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 != )
{
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

UWP 律师查询 MVVM的更多相关文章

  1. UWP 律师信息 MVVM 2.0版本

    由于1.0版本存在一个很大的BUG,一直也没有找到问题所在,后来,一位在微软的朋友说,他们的测试小妹给出的结果是框架的问题,所以,就直接整体重构了代码,也布局设计上,由跳转页面变为了UWP常见的左侧列 ...

  2. WPF、Sivelright、UWP

    Sivelright:  http://www.cnblogs.com/webabcd/category/106371.html UWP 律师查询 MVVM WPF入门教程系列一——基础 WPF入门教 ...

  3. UWP中新加的数据绑定方式x:Bind分析总结

    UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也 ...

  4. 2019-11-29-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199

    title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2019-11-29 10:16: ...

  5. 2018-9-1-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199

    title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2018-09-01 16:24: ...

  6. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  7. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  8. UWP开发之Mvvmlight实践九:基于MVVM的项目架构分享

    在前几章介绍了不少MVVM以及Mvvmlight实例,那实际企业开发中将以那种架构开发比较好?怎样分层开发才能节省成本? 本文特别分享实际企业项目开发中使用过的项目架构,欢迎参照使用!有不好的地方欢迎 ...

  9. UWP开发之Mvvmlight实践三:简单MVVM实例开发(图文详解付代码)

    在做MVVM各种框架对比之前,我觉得有必要先自己做一个简单的MVVM实现案例比较好,这样就可以看到自己实现的时候有那些不方便的地方.而各种框架又是怎么解决我们这些麻烦的. 案例介绍:用户登录画面,没有 ...

随机推荐

  1. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  2. dubbo服务提供与消费

    一.前言 项目中用到了Dubbo,临时抱大腿,学习了dubbo的简单实用方法.现在就来总结一下dubbo如何提供服务,如何消费服务,并做了一个简单的demo作为参考. 二.Dubbo是什么 Dubbo ...

  3. ls: 无法访问/usr/sbin/smartctl: 没有那个文件或目录

    环境:RHEL6.5 + Oracle 11.2.0.4 RAC 在安装RAC时,检查时缺少包 cvuqdisk-1.0.9-1,oracle提供脚本修复安装. 但在执行时报错: [root@orad ...

  4. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  5. Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )

    在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...

  6. chrome拓展开发实战:页面脚本的拦截注入

    原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...

  7. ASP.NET MVC 视图(一)

    ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...

  8. ABP框架 - 启动配置

    文档目录 本节内容: 配置ABP 替换内置服务 配置模块 为一个模块创建配置 ABP在启动时,提供基础框架和模型来配置和模块化. 置ABP 在预初始化事件中进行配置,示例: kid1412注:XmlL ...

  9. 再次思考 classpath 环境变量 等

    f:\aspectj1.8\lib\aspectjrt.jar;.;%JAVA_HOME%\lib;C:\Temp\IBM\SQLLIB\java\db2java.zip;C:\Temp\IBM\SQ ...

  10. Docker学习总结

    本文作为总结性文章,不会详细讲解Docker.但会把已学习的.了解的内容按照由易到难的顺序串起来,更多的是帮助Docker新手快速的了解Docker,知道目前处在哪个阶段,接下来该学些什么,避免碰太多 ...