前言

TypeScript 是一种由微软开发的自由开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程安德斯·海尔斯伯格C#的首席架构师,已工作于TypeScript的开发。TypeScript扩展了 JavaScript 的句法,所以任何现有的JavaScript程序可以不加改变的在TypeScript下工作。TypeScript是为大型应用之开发而设计,而编译时它产生 JavaScript 以确保兼容性。TypeScript 支持为已存在的 JavaScript 库添加类型信息的头文件,扩展了它对于流行的库如 jQueryMongoDBNode.js和 D3.js 的好处。
 
TypeScript 的官方地址:http://www.typescriptlang.org/

实战

1. 定义实体类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace TypeScriptMvc.Models
  7. {
  8. public class TaskDetails
  9. {
  10. public int Id { get; set; }
  11. public string Title { get; set; }
  12. public string Details { get; set; }
  13. public DateTime Starts { get; set; }
  14. public DateTime Ends { get; set; }
  15. }
  16. }

2. 控制器(Controller)代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using TypeScriptMvc.Models;
  7.  
  8. namespace TypeScriptMvc.Controllers
  9. {
  10. public class HomeController : Controller
  11. {
  12.  
  13. public ActionResult Tasks()
  14. {
  15. List<TaskDetails> tasks = new List<TaskDetails>();
  16. for (int i = ; i < ; i++)
  17. {
  18. TaskDetails newTask = new TaskDetails
  19. {
  20. Id = i,
  21. Title = "Task " + (i + ),
  22. Details = "Task Details " + (i + ),
  23. Starts = DateTime.Now,
  24. Ends = DateTime.Now.AddDays(i + )
  25. };
  26. tasks.Add(newTask);
  27. }
  28. return View(tasks);
  29. }
  30.  
  31. }
  32. }

这里仅仅是循环生成了 10 条 TaskDetails 记录,并把它作为 Model 传递给 View。

3. View.cshtml 代码

  1. @model IEnumerable<TypeScriptMvc.Models.TaskDetails>
  2.  
  3. <p>
  4. @Html.ActionLink("Create New", "Create")
  5. <input type="hidden" id="serverJSON" value="@Newtonsoft.Json.JsonConvert.SerializeObject(Model)" />
  6. </p>
  7. <table class="table">
  8. <tr>
  9. <th>
  10. Title
  11. </th>
  12. <th>
  13. Details
  14. </th>
  15. <th>
  16. Starts
  17. </th>
  18. <th>
  19. Ends
  20. </th>
  21. <th></th>
  22. </tr>
  23. <tbody data-bind="foreach: tasks">
  24. <tr>
  25. <td data-bind="text: title"></td>
  26. <td data-bind="text: details"></td>
  27. <td data-bind="text: starts"></td>
  28. <td data-bind="text: ends"></td>
  29. <td></td>
  30. </tr>
  31. </tbody>
  32. </table>
  33.  
  34. @section Scripts{
  35. <script src="~/Scripts/knockout-2.3.0.js"></script>
  36. <script src="~/Scripts/moment.min.js"></script>
  37. <script src="~/Scripts/typescript-list.js"></script>
  38. }

首先,我们看到 JSON 序列化了 Controller 传过来的 Model,然后用了一个 HTML Hidden 来保存。然后用 Knockout JS 的语法(请注意 <tbody> 中的 data-bind)来呈现数据,那么  Knockout JS 的数据源从哪里来呢?我们接着往下看。我们看到底部引用了一个 typescript-list.js ,进去瞧瞧。PS:typescript-list.js 这个 JS 文件并不是什么第三方 Javascript 库,完全可以把它改成 aaa.js 。另外那 2 个 JS 文件(knockout-2.3.0.js 和 moment.min.js)就是第三方库了。

4. 进入 typescript-list.js

找到 typescript-list.js 文件

  1. ///<reference path="typings/jquery/jquery.d.ts" />
  2. ///<reference path="typings/knockout/knockout.d.ts" />
  3. var TaskDetails = (function () {
  4. function TaskDetails(id, title, details, starts, ends) {
  5. this.id = ko.observable(id);
  6. this.title = ko.observable(title);
  7. this.details = ko.observable(details);
  8. this.starts = ko.observable(moment(starts).format("MMM DD, YYYY h:mm:ss a"));
  9. this.ends = ko.observable(moment(ends).format("MMM DD, YYYY h:mm:ss a"));
  10. }
  11. return TaskDetails;
  12. })();
  13.  
  14. var TaskViewModel = (function () {
  15. function TaskViewModel() {
  16. this.tasks = ko.observableArray([]);
  17. }
  18. return TaskViewModel;
  19. })();
  20.  
  21. $(document).ready(function () {
  22. var serverData;
  23. serverData = JSON.parse($("#serverJSON").val());
  24. var vm;
  25. var i;
  26. vm = new TaskViewModel();
  27. for (i = 0; i < serverData.length; i++) {
  28. var serverTask;
  29. serverTask = serverData[i];
  30. vm.tasks.push(new TaskDetails(serverTask.Id, serverTask.Title, serverTask.Details, serverTask.Starts, serverTask.Ends));
  31. }
  32. ko.applyBindings(vm);
  33. });
  34. //# sourceMappingURL=typescript-list.js.map

根据 TypeScript 的背景,我猜测这个 js 文件是编译后动态生成的,语言就是 TypeScript。果然,在目录 /Scripts 下,我找到了 typescript-list.ts。 扩展名是 ts,也就是去 TypeScript 的 2 个单词的首字母。我还注意到还有一个 typescript-list.js.map 文件,我猜应该也是由 TypeScript 动态生成的,下面我们进入 typescript-list.ts 瞧瞧。

typescript-list.js.map 内容如下:

  1. {
  2. "version":3,
  3. "file":"typescript-list.js",
  4. "sourceRoot":"",
  5. "sources":["typescript-list.ts"],
  6. "names":["TaskDetails","TaskDetails.constructor","TaskViewModel","TaskViewModel.constructor",""],
  7. "mappings":"AAAA,kDAAkD;AAClD,sDAAsD;AAEtD;IAOIA,qBAAYA,EAAUA,EAAEA,KAAaA,EAAEA,OAAeA,EAClDA,MAAcA,EAAEA,IAAYA;QAC5BC,IAAIA,CAACA,EAAEA,GAAGA,EAAEA,CAACA,UAAUA,CAACA,EAAEA,CAACA,CAACA;QAC5BA,IAAIA,CAACA,KAAKA,GAAGA,EAAEA,CAACA,UAAUA,CAACA,KAAKA,CAACA,CAACA;QAClCA,IAAIA,CAACA,OAAOA,GAAGA,EAAEA,CAACA,UAAUA,CAACA,OAAOA,CAACA,CAACA;QACtCA,IAAIA,CAACA,MAAMA,GAAGA,EAAEA,CAACA,UAAUA,CAACA,MAAMA,CAACA,MAAMA,CAACA,CAACA,MAAMA,CAACA,yBAAyBA,CAACA,CAACA,CAACA;QAC9EA,IAAIA,CAACA,IAAIA,GAAGA,EAAEA,CAACA,UAAUA,CAACA,MAAMA,CAACA,IAAIA,CAACA,CAACA,MAAMA,CAACA,yBAAyBA,CAACA,CAACA,CAACA;IAC9EA,CAACA;IACLD;AAACA,CAAAA,IAAA;;AAED;IAEIE;QACIC,IAAIA,CAACA,KAAKA,GAAGA,EAAEA,CAACA,eAAeA,CAACA,EAAEA,CAACA,CAACA;IACxCA,CAACA;IACLD;AAACA,CAAAA,IAAA;;AAED,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;IACdE,IAAIA,UAAUA,CAAQA;IACtBA,UAAUA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,CAACA,CAACA,aAAaA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,CAACA;IAChDA,IAAIA,EAAEA,CAAgBA;IACtBA,IAAIA,CAACA,CAASA;IACdA,EAAEA,GAAGA,IAAIA,aAAaA,CAACA,CAACA,CAACA;IACzBA,KAAKA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,UAAUA,CAACA,MAAMA,EAAEA,CAACA,EAAEA,CAAEA;QACpCA,IAAIA,UAAUA,CAAMA;QACpBA,UAAUA,GAAGA,UAAUA,CAACA,CAACA,CAACA,CAACA;QAC3BA,EAAEA,CAACA,KAAKA,CAACA,IAAIA,CAACA,IAAIA,WAAWA,CAACA,UAAUA,CAACA,EAAEA,EAAEA,UAAUA,CAACA,KAAKA,EAAEA,UAAUA,CAACA,OAAOA,EAAEA,UAAUA,CAACA,MAAMA,EAAEA,UAAUA,CAACA,IAAIA,CAACA,CAACA,CAACA;KAC3HA;IACDA,EAAEA,CAACA,aAAaA,CAACA,EAAEA,CAACA,CAACA;AACzBA,CAACA,CAAC,CAAC"
  8. }

看完,我们继续探索。

5. 进入 typescript-list.ts

找到 typescript-list.ts 文件。

  1. ///<reference path="typings/jquery/jquery.d.ts" />
  2. ///<reference path="typings/knockout/knockout.d.ts" />
  3.  
  4. class TaskDetails {
  5. id: KnockoutObservable<number>;
  6. title: KnockoutObservable<string>;
  7. details: KnockoutObservable<string>;
  8. starts: KnockoutObservable<string>;
  9. ends: KnockoutObservable<string>;
  10.  
  11. constructor(id: number, title: string, details: string,
  12. starts: string, ends: string) {
  13. this.id = ko.observable(id);
  14. this.title = ko.observable(title);
  15. this.details = ko.observable(details);
  16. this.starts = ko.observable(moment(starts).format("MMM DD, YYYY h:mm:ss a"));
  17. this.ends = ko.observable(moment(ends).format("MMM DD, YYYY h:mm:ss a"));
  18. }
  19. }
  20.  
  21. class TaskViewModel {
  22. public tasks: KnockoutObservableArray<TaskDetails>;
  23. constructor() {
  24. this.tasks = ko.observableArray([]);
  25. }
  26. }
  27.  
  28. $(document).ready(function () {
  29. var serverData: any[];
  30. serverData = JSON.parse($("#serverJSON").val());
  31. var vm: TaskViewModel;
  32. var i: number;
  33. vm = new TaskViewModel();
  34. for (i = ; i < serverData.length; i++) {
  35. var serverTask: any;
  36. serverTask = serverData[i];
  37. vm.tasks.push(new TaskDetails(serverTask.Id, serverTask.Title, serverTask.Details, serverTask.Starts, serverTask.Ends));
  38. }
  39. ko.applyBindings(vm);
  40. });

请注意这 2 行代码:

  1. ///<reference path="typings/jquery/jquery.d.ts" />
  2. ///<reference path="typings/knockout/knockout.d.ts" />

这个可能是由 TypeScript 官方提供的组件。

可参看网址:

用近似静态语言、强类型语言的TypeScript开发属于动态语言、弱类型语言的JavaScript

代码下载:https://github.com/dotnetcurry/typescript-ko-mvc

谢谢浏览!

一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。的更多相关文章

  1. ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。

    一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript . 前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaS ...

  2. 一个简单的ASP.NET MVC异常处理模块

    一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行.异常处理应该是一个横切点,所谓横切点就是各个部分都 ...

  3. ASP.NET MVC验证码演示(Ver2)

    前一版本<ASP.NET MVC验证码演示>http://www.cnblogs.com/insus/p/3622116.html,Insus.NET还是使用了Generic handle ...

  4. 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数

    [问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...

  5. 在ASP.Net MVC 中,如何在Global.asax中配置一个指向Area内部的默认Route

    ASP.Net MVC 中配置Route的时候可以设置一个默认的Route. 比如我要在输入http://localhost的时候默认进入http://localhost/home/index.可以在 ...

  6. 开始一个简单的ASP.NET Web API 2 (C#)

    创建一个Web API 项目 在本教程中,你将使用ASP.NET Web API 来创建一个web API 并返回产品列表. 网页前端使用jQuery 显示结果. 选择ASP.NET Web Appl ...

  7. 从一个简单的ASP.NET 5站点开启.NET跨平台之旅

    在经历了阿里云上“黑色1秒”的空欢喜之后,我们“被迫”考虑实现.NET的跨平台,将Web服务器由Windows换成Linux.而这种“被迫”在一个存在已久的愿望下,变得水到渠成.这个愿望就是 —— “ ...

  8. ASP.NET MVC验证码演示

    我们在网站登录或理一个评论时,可以放置一个验证码(Captcha),可以为系统免去那些恶意刷新等功能. 今次Insus.NET在asp.net mvc应用程序实现与演示验证码的产生以及应用等 . 前天 ...

  9. 简单的ASP.NET MVC发布

    学习这样久的ASP.NET MVC,但一直没有实现过发布MVC程序.今天来试试. 分两个部分进行,先是第一部分,Visual Studio的publish:创建一个带有实例的ASP.NET MVC: ...

随机推荐

  1. 解决 "Windows 无法启动Mongo DB服务 错误:1067 进程意外终止"

    在启动MongoDB服务时,有时会报上图所示的错误,解决方案为: 1. MongoDB安装目录\data\将此文件夹下的mongod.lock删除 2. 查看官方文档或按照上一篇安装文章检查是否设置d ...

  2. JVM中的垃圾收集算法和Heap分区简记

    如何判断垃圾对象? 垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理.   引用计数(ReferenceCounting)算法 这种方法比较简单直观,FlashPlayer/Pyt ...

  3. 【CUDA学习】GPU硬件结构

    GPU的硬件结构,也不是具体的硬件结构,就是与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor  最 ...

  4. 解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常

    在web.config中加入 <httpRuntime maxRequestLength="22000" executionTimeout="43200" ...

  5. angular post表单

    参数文章:http://angularjs.cn/A0qF angularjs中Post使用的是json的交互方法,一般服务器还没达到这个阶段,我们可以用回传统的&参数的方法: var myA ...

  6. 2013年ACM湖南省赛总结

    今年的比赛最大的变化就是改用OJ判题了,相比于PC^2确实省事了不少,至少可以直接复制样例了.题目方面依旧是刘汝佳命题,这点还是相当好的,至少给人以足够的安全感. 开始比赛之后安叔瞬间就把前半部分题目 ...

  7. paypal之nodejs 框架 Kraken-js 源码分析

    本文是基于 kraken-js 0.6.1 版本的 关于如何使用kraken-js 可以去看看官网的使用文档 点击这里 .kraken-js 是基于express之上的,目的在于让工程师更多的去关注代 ...

  8. 【转】20个Cydia常见错误问题解决方法汇总

    对于已经越狱的用户来说,经常会使用Cydia来安装一些酷炫或实用插件,但是有时候它总是会出现一些问题,以下收集了在Cydia经常遇到的问题,供大家参考: 一.主屏幕没有 Cydia 图标 1.设备需已 ...

  9. ECshop设置301最快捷最简单的方法

    ECshop设置301最快捷最简单的方法 在 init.php中加入以下代码 if (strtolower($_SERVER['SERVER_NAME'])!='www.fz1688.com') { ...

  10. MYSQL校对规则

    一.前言 有时候遇到这种情况,你用一个like语句查询,查到的结果中有一些并没有包含你查询的关键词的纪录:有时候遇到这种情况,你的数据库自作聪明的大小写不敏感,让你在更新时把大小写不同的两条记录都更新 ...