最近在项目中用到了离线功能,自己感觉挺高端的,但是遇到了一些问题。

现在工作告一小段落,就把这次离线工作中遇到的关键技术点和难题记录下来。

什么是离线,什么时候需要离线

离线:Offline,不联网也能使用。简单说就是在线的时候下载保存一些文件到本地,然后在离线的时候,依赖这些文件实现类似在线的操作。最好做到让使用者没有明显的感觉到在线、离线的区别。

什么时候需要离线:比如我们要去深山老林做一些考察,那里没有Wifi,没有移动信号,但是我们需要保存一些数据到移动电子设备上。这时候离线就是一个不错的选择。

在项目中是如何做到的离线

1 所有的需要离线操作的View对应的Action返回Model的时候,增加一个标记字段,比如Bool? IsOffline{get;set;},离线为True,其他为False;

2 所有的View中增加一个离线Layout,基本模式是

@{
ViewBag.Title = "Offline";
if (Model.IsOffline)
{
Layout = "~/Views/Shared/_OfflineLayoutView.cshtml";
}
}

3 OfflineLayoutView是离线功能的一个核心点--Manifest。

<!DOCTYPE html>
<!--[if (gte IE 9)|!(IE)]><!-->
<html lang="en" id="html" manifest="@Url.Action("Manifest", "Offline", new { area = "" })">
<!--<![endif]—>

这里指向了一个Action :Manifest

View :Manifest是一个列表清单文件,列下了所有需要在离线中使用到的文件,包括但不仅限于Js,Css,View等。

大致代码如下

   1:  @using System.Configuration;
   2:  @{ 
   3:      Response.ContentType = "text/cache-manifest";
   4:      Response.ContentEncoding = System.Text.Encoding.UTF8;
   5:      Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
   6:   
   7:      Layout = null; 
   8:  }CACHE MANIFEST
   9:  #@Model.LastBuild
  10:   
  11:  <text>@Url.Action("Offline***List", "***", new { area = "**" })</text>
  12:  NETWORK:
  13:  *
  14:   
  15:  CACHE:
  16:  #CSS files
  17:  @Url.Content("~/Content/")**.css
  18:   
  19:  #JS files
  20:  @Url.Content("~/Scripts/")jquery-1.8.3.min.js

4 在在线的界面中增加一个按钮 Enter Offline Model,链接到上述View的某一个即可。

之后就进入离线了,第一次进入离线的时候会下载所有清单文件到本地。

下载之后的文件可以在Chrome浏览器中清楚的看到,地址 :chrome://appcache-internals/

IE的查看方法暂时还不明了

遇到的一些问题

1 在我的开发环境下是每次Build工程之后才会下载文件,但是同事的环境是修改之后刷新就会下载,和普通的在线没什么区别。

注意这可能是一个坑,因为修改了源文件,直接刷新,可能没有起到作用,浏览器没有变化,请检查是否下载了修改后的文件;

2 Jquery的问题。 View中某一元素设置Class为Phone,然后

<script type="text/javascript">
if (jQuery.validator) {
jQuery.validator.addMethod("phone", function (phone_number, element) {
phone_number = phone_number.replace(/\s+/g, "");
return 。。。。。;
}, "Please specify a valid phone number");
。。。。

来判断输入的是否是合法的电话号码

在线的时候没任何问题,离线就各种不好使。最后无奈在 $(document).ready()中重写了一遍才OK

2014/3/24 修改  终于查明了原因,在Layout中引入了Jquery,在View中再次引入了一遍,造成冲突

可以进入离线了,但是没有联网,数据怎么保存呢?项目中使用的是LocalStorage

下篇文章预告:LocalStorage的一些使用

离线在MVC4中的使用的更多相关文章

  1. MVC4中基于bootstrap和HTML5的图片上传Jquery自定义控件

    场景:mvc4中上传图片,批量上传,上传前浏览,操作.图片进度条. 解决:自定义jquery控件 没有解决:非图片上传时,会有浏览样式的问题; 解决方案; 1.样式 – bootstrap 的css和 ...

  2. Autofac在MVC4中牛刀小试

    Autofac是传说中速度最快的一套.NET高效的依赖注入框架.Autofac的介绍与使用请去参考Autofac全面解析系列(版本:3.5).   这里介绍的已经挺详细的啦. 下面我就先来说说MVC4 ...

  3. ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)

    在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...

  4. MVC4中使用Ninject

    MVC4中使用Ninject 1.NuGet获取Ninject.dll .NET技术交流群 199281001 .欢迎加入. 2.全局注册  Global.asax.cs  RegisterNinje ...

  5. mvc4中jquery-ui日期控件datepicker的应用

    mvc4中jquery-ui日期控件datepicker的应用 本文适合mvc中日期选择需要的同学: 假设读者已经具备了mvc4和javascript中的相关知识 一. 开始项目之前把项目中目录:/C ...

  6. WebSocket在ASP.NET MVC4中的简单实现

    WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...

  7. ASP.NET MVC4中使用NHibernate

    ASP.NET MVC4中使用NHibernate 1:下载安装NHibernate 打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages.你会 ...

  8. MVC4中使用SignalR

    MVC4中使用SignalR 前言 周末在偶尔翻阅微软官网的时候看到Getting Started with SignalR and MVC 4此篇文章,知道了signalr这个东西,貌似这个出来很长 ...

  9. MVC4 中的Model显示设置(含显示Shared/DisplayTemplates和编辑Shared/EditorTemplates)

    转载于: MVC4 中的Model显示设置(含显示Shared/DisplayTemplates和编辑Shared/EditorTemplates) 虽然 [Display(Name="XX ...

随机推荐

  1. Webpack Getting Started

    [Webpack Getting Started] Make sure you have a fresh version of Node.js installed. If you are using ...

  2. 无线渗透wpa加密路由器

    破解wpa加密路由器的原理不同于破解wep加密路由器,只能通过暴力破解获取. 但是获取握手keystream的原理差不多 首先杀死可能会和破解冲突的进程 airmon-ng check kill 开启 ...

  3. 每月IT摘录201810

    技术 1.Redis.对于单机实例,我们采用原生主从(Master-Slave)模式实现高可用,常规模式下对外仅暴露 Master 节点.由于使用原生 Redis,所以单机实例支持所有 Redis 指 ...

  4. 基本数据类型(list,tuple)

    基本数据类型(list,tuple)内容: 1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range⼀. 列表1.1 列表的介绍列表是python的基础数据类型之⼀,其他编程 ...

  5. java 1.8

    rpm -qa|grep java (列出本机已安装的java,没有则没空)rpm -e --nodeps 文件名(上一步查到的文件名,一个一个复制过来卸载就好.) 下载java包 https://w ...

  6. GIT 命令集

    Git图形化界面 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remot ...

  7. NumPy 字符串函数

    NumPy 字符串函数 以下函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作. 它们基于 Python 内置库中的标准字符串函数. ...

  8. TOJ 2130: Permutation Recovery(思维+vector的使用)

    传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2130 时间限制(普通/Java): ...

  9. Apache+PHP+MySQL环境搭建

    准备安装包:Apache: apache_2.2.11-win32.msi (http://pan.baidu.com/s/1nvdiNcH)PHP: php-5.2.5-Win32.zip (htt ...

  10. [剑指Offer]判断一棵树为平衡二叉树(递归)

    题目链接 https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=0&tqId=0&rp=2&a ...