原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savorboard) 现在,已经有很多种方式来扩展Razor视图了,我们循循渐进,先从最简单的开始。 如果你之前熟悉MVC5(以及之前的MVC)中的视图的话,有一部分你应该已经很熟悉了。在新的ASP.NET Core 中,那些你熟悉的方式有一部分仍然能用,只是Core版本针对视图又添加了一些东西。这篇文章,我们就来一起看看吧。 #1:数据视图(Typed Views) 这是一个不具有动态内容的最基本的一个视图,就是你定义一个ViewModel , 然后ViewModel具有一些默认值,在视图上直接呈现而已。定死的ViewModel,好像不是很常见,以至于你使用Visual Studio新建一个默认的Web应用程序的话,都看不到它。它就看起来像一个*.cshtml结尾的HTML文件,但是,cshtml文件却是服务端可以解析的一种文件,所以你可以在里面使用一些Razor语法,比如HtmlHelpers,UrlHelpers等。同样,你可以使用ViewBag或者ViewData来从Controller的Action传输数据到View里面,来让它具有动态的内容。但是ViewBag和ViewData都是弱类型的,所以没有智能提示,用起来略不爽。 要在你的视图中使用强类型数据对象,你需要定义一个Model来在视图中使用。
1 2 3 4 |
<span class="xml">@model ExtendViews.ViewModels.AboutModel <span class="hljs-comment"><!-- usage: ---></span> @Model.FullName</span> |
这种方式是不是很常见的? 下一种方式是一个更好的方式来布局我们的视图: #2:布局(Layouts): 相当于ASP.NET的WebForms的母版页,不过它是定义Razor视图的基本布局的一种方式。它就是_Layout.cshtml, 位于 Views\Shared 文件夹里 。通常情况下这个文件通常包含HTML的header,body和公用的一些东西。你可以多建几个互相进行组合,来完成整个站点的布局。其他页面引用布局视图页的时候,是这样子写的(注意不需要扩展名):
1 2 3 |
@<span class="hljs-keyword">{</span> Layout = <span class="hljs-string">"_Layout"</span>; } |
此调用需要在您的视图的第一行中。但你不需要在每一个视图中定义布局,如果你使用Visual Studio新建一个ASP.NET Core项目,Views文件夹有一个_ViewStart.cshtml,在运行的时候它会自动的导入到每个视图中去。 在_Layout.cshtml有一个方法法叫 RenderBody(),它就是用来渲染详细的视图页到模板布局视图中:
1 |
<span class="hljs-meta">@RenderBody()</span> |
在此方法的位置,详情视图就会被渲染到这里。 #3: 区域(Sections) 有时候子视图中想在主视图中显示一部分html代码,比如javascript代码或者是css,这个时候就可以使用Sections,通常情况下在页面的结尾部分。 在主视图中(_Layout.cshtml)定义一个Javascripts Section:
1 2 |
<span class="hljs-meta">@RenderSection</span>(<span class="hljs-string">"scripts"</span>, <span class="hljs-string">required:</span> <span class="hljs-literal">false</span>) |
有一个required参数来声明这个Section是否必须的。然后你就可以在子视图中这样使用:
1 2 3 4 5 6 7 8 |
<span class="xml">@section scripts { <span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="javascript"> $(<span class="hljs-function"><span class="hljs-keyword">function</span>() </span>{ <span class="hljs-comment">// some more js code here;</span> }); </span><span class="hljs-tag"></<span class="hljs-name">script</span>></span> }</span> |
如果你使用嵌套的布局,你可能需要嵌套这个区域。意思就是你在Section里面嵌套调用RenderSection():
1 2 3 4 |
<span class="hljs-meta">@section</span> scripts { <span class="hljs-meta">@RenderSection</span>(<span class="hljs-string">"scripts"</span>, <span class="hljs-string">required:</span> <span class="hljs-literal">false</span>) } |
#4: 分部视图( PartialViews) 你可以提取html页面中重用的部分,把它放到一个新的Razor视图中,这个视图没有自己的Action,这种视图就叫做分部视图。 分部视图通常也在Views\Shard\文件夹。 分部视图同样也可以是一个数据视图,它可以从父视图中获取数据(但不是必须的):
1 2 3 4 5 6 7 8 9 10 |
@<span class="hljs-keyword">model</span> IEnumerable<UserModel> @if (Model.Any()) { <<span class="hljs-selector-tag">ul</span>> @<span class="hljs-keyword">foreach</span> (var user in Model) { <<span class="hljs-selector-tag">li</span>>@<span class="hljs-keyword">user.FullName</li></span> } </ul> } |
这个分部视图需要从父视图中获取用户列表的数据
1 |
@<span class="hljs-keyword">{</span> await Html.RenderPartialAsync(<span class="hljs-string">"Users"</span>, Model.Users);} |
如果你的分部视图没有定义用户模型,你就不需要传第二个参数。 #5:视图组件(ViewComponents) 这个 ASP.NET Core特有的。 译者注:类似于以前的用户控件 有时候你需要做一些分部视图的事情,但是又包含一些业务逻辑在里面。在过去,你可以使用ChildAction渲染结果到一个视图中,但是,在 ASP.NET Core中,有一种新的方式来做这件事情,它就是ViewComponents(我已经写了一篇关于ViewComponents的博文)。它类似于在MVC中的一种迷你的MVC,也就是说他们可以有自己的Controller,和单个的action以及view。ViewComponents是完全独立于你的当前视图的,但是可以通过你当前的视图传输数据。 想这样调用它,来渲染一个ViewComponents:
1 |
@Component.Invoke(<span class="hljs-string">"Top10Articles"</span>); |
可以看我的博客来学习怎么创建自己的ViewComponent。 #6: HTML助手(HtmlHelpers) 在HTMLHelper类中,你可以创建你自己的扩展方法来扩展Razor语法:
1 2 3 4 5 6 7 |
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">class</span> <span class="hljs-title">HtmlHelperExtensions</span> { <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> HtmlString <span class="hljs-title">MyOwnHtmlHelper</span>(<span class="hljs-params"><span class="hljs-keyword">this</span> HtmlHelper helper, <span class="hljs-keyword">string</span> message</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> HtmlString($<span class="hljs-string">"<span>{message}<span>"</span>); } } |
在你的视图中,创建一个可重用的部分是非常有用的,它比分部视图多包含了一些业务逻辑。比HTMLHelpers扩展更好的是新的TagHelpers,但是在扩展你视图的时候,HTMLHelpers仍然有它自己的一些适用的地方。 #7: 标签助手(TagHelper) 这是 ASP.NET Core 非常好的一个新特性。 一个扩展你视图的小助手,它看起来像一个原生的HTML标签一样。 在ASP.NET Core MVC中你应该使用 TagHelpers 来替换 HtmlHelpers,因为它们更加的简洁和容易使用。另一个巨大的好处就是依赖注入,在HtmlHelpers中是使用不了的,因为HtmlHelpers 扩展的都是静态内容。 但TagHelpers是一个公共类,我们可以很容易的在它的构造函数中注入服务。 下面是一个很简单的小示例,来展示怎么样定义一个TagHelper:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[TargetElement(<span class="hljs-string">"hi"</span>)] <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">HelloTagHelper</span> : <span class="hljs-title">TagHelper</span> { <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">override</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Process</span>(<span class="hljs-params">TagHelperContext context, TagHelperOutput output</span>) </span>{ output.TagName = <span class="hljs-string">"p"</span>; output.Attributes.Add(<span class="hljs-string">"id"</span>, context.UniqueId); output.PreContent.SetContent(<span class="hljs-string">"Hello "</span>); output.PostContent.SetContent(<span class="hljs-keyword">string</span>.Format(<span class="hljs-string">", time is now: {0}"</span>, DateTime.Now.ToString(<span class="hljs-string">"HH:mm"</span>))); } } |
这里定义了一个叫做hi的标签,它以HTML标记来呈现,p标签的内容是当前时间。 使用:
1 |
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">hi</span>></span>John Smith<span class="hljs-tag"></<span class="hljs-name">hi</span>></span></span> |
结果:
1 |
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">p</span>></span>Hello John Smith, time is now: 18:55<span class="hljs-tag"></<span class="hljs-name">p</span>></span></span> |
[…]
View Details前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问。 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那么此篇文章你值得收藏。 如果你觉得对你有帮助的话,不妨点个【推荐】。 目录 什么是守护进程 Supervisor 介绍 Supervisor 安装 Supervisor 配置,常用命令 Supervisor UI管理台 什么是守护进程 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。 此处的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程创建一个守护进程。 在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。 原因有两点: 1、它是微软官方文档推荐的,降低学习成本。 2、它并不一定是最好的,但一定是文档最全的。 Supervisor 介绍 Supervisor是采用 Python(2.4+) 开发的,它是一个允许用户管理 基于 Unix 系统进程的 Client/Server 系统,提供了大量功能来实现对进程的管理。 官方文档:http://supervisord.org/ Supervisor 安装 在 masOS 中直接使用brew工具进行安装即可: brew install supervisor 在 linux 中使用以下命令进行安装: ubuntu sudo apt-get install supervisor centos yum install supervisor python pip install supervosor easy_install supervisor 安装完成之后:
1 2 |
mac:~ yangxiaodong$ brew install supervisor Warning: supervisor-3.2.1 already installed |
Supervisor 配置,常用命令 安装完成之后,在 /ect/supervisor/conf.d/ 目录下新建一个配置文件(touch HelloWebApp.conf),取名为 HelloWebApp.conf […]
View DetailsChapter 1 什么是DDD: 1、介绍领域驱动设计思想体系 和传统开发方式比起来,领域驱动是一种新的软件架构设计,它主要用来解决传统开发中代码杂乱无章,任意拼贴等最终导致程序难以维护而诞生的。 它提出软件变得复杂和难以管理的主要原因是,领域复杂性和技术复杂性混合在了一起。 2、DDD如何管理复杂性 提炼问题重点、创建模型解决问题、使用公共语言建模协作、理解上下文关系。 DDD的侧重点:核心领域、协作、与领域专家探讨、复杂域模型的上下文理解。 3、DDD常见误区 DDD是框架、DDD是灵丹妙药 Chapter 2 提炼问题域: 1、知识提炼,领域知识的重要性 2、业务分析员,提炼知识是一个持续过程,每一次迭代,模型都会有所变化。 3、与领域专家一起获得见解 4、使用BDD专注于应用程序的行为 Chapter 3 专注于核心领域: 1、找出核心,支撑和通用域 2、提炼有助于降低问题空间的复杂性 3、并非一个系统的所有部分都被精心设计 Chapter 4 模型驱动设计: 1、Code First模型驱动设计 2、使用该领域的通用语言来在代码中描述,代码是表述模型的主要形式,需要使用通用语言来约束它。 3、要让团队里面领域中隐含的观念变得明确并赋予会组成共享通用语言的名称。 4、通用语言应该用于测试,类名称,和方法。 5、仅为核心领域应用模型驱动设计并创建UL才能带来变化,不要将这些实践应用到整个应用程序。 Chapter 5 领域模型实现模式: 1、领域层:是包含领域模型的代码区域,他将领域模型的复杂性和应用程序偶发的技术复杂性隔离开来,负责确保基础架构关注的是想管理事务和持久化这样的问题,而不会掺入业务问题并却不会让领域中已经有的规则变模糊。 图1、表示领域模型代码仅构成整体代码库的一小部分 2、领域模型模式是基于没有数据库前提的,因此它可以演化并且以完全忽略持久化的方式来创建。 在设计领域模型时,不要从数据模型开始。相反要从代码模型开始(Code First),与数据驱动设计相反的模型驱动。仅当必须考虑模型持久化时,才能在设计上做出让步。模型内的领域对象成为普通老方C#对象(POCO)。这些类不再与基础架构问题有关并却完全忽略持久性。 3、事务脚本:事务脚本整个用例都是封装在单个方法中,如数据检索,持久化,事务管理,和业务逻辑。 事务脚本缺点:对于不知道面向对象的程序员来说是一种有帮助的模式,但是如果逻辑变得复杂,事务脚本会变得很难管理,事务脚本就会出现问题。 表模式:单个对象代表数据库中的一个表或视图,适合于数据库驱动设计(DB First),不适合DDD。这个模式适合于领域中由有界上下文隔离的更简单 部分以及简单数据形式来说,非常合适并且比领域模型模式更易于掌握。但是如果对象模型和数据库模型出现分歧,那么就需要朝着DDD模式的方向进行重构。 4、活动记录:类似于表模式,是一种流行的模式,每个业务对象都负责其自身的持久化一起相关的业务逻辑,类似于Repository<T>。 5、贫血领域模型:又称为反模式。违背了“只问不说”的原则,这个模式下领域服务会承担代码更具程序性风格的角色。贫血模型是DDD中一个良好开局。 Chapter 6 使用有界上下文维护领域模型的完整性: 1、大模型容易出错,系统扩展越多,模型越复杂 2、使用有界上下文和破除大模型 3、有界上下文拥有从展现层到领域逻辑层,再到持久化,甚至到数据存储功能的垂直切片。 […]
View Details一、操作符优化 1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。 2、NOT IN操作符 此操作是强列不推荐使用的,因为它不能应用表的索引。 推荐方案:用NOT EXISTS 方案代替 3、IS NULL 或IS NOT NULL操作(判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。 推荐方案:用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>’’等。不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。 4、> 及 < 操作符(大于或小于操作符) 大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。 5、LIKE操作符 LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。 一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。 6、UNION操作符 UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。 select * from gc_dfys union all select * from ls_jg_dfys 二、SQL书写的影响 1、同一功能同一性能不同写法SQL的影响。 如一个SQL在A程序员写的为 Select * from zl_yhjbqk B程序员写的为 Select * from dlyx.zl_yhjbqk(带表所有者的前缀) C程序员写的为 Select * from DLYX.ZLYHJBQK(大写表名) D程序员写的为 Select * […]
View Details一.Windows7下的Python环境搭建 1.Google下载python-2.6.msi安装包,以管理员身份运行,安装时候注意不要在有中文目录的程序下安装。安装完成之后可以在开始菜单中看到。 2.配置环境变量。不用配置也可以,不过配置之后后面会方便很多。 配置方法:右键“我的电脑”选择“属性”,切换到“高级”选项卡,选择环境变量,在“系统变量”下选择“Path”变量,然后点击“编辑”按钮,添加Python安装目录。配置完成之后可以打开cmd输入”python”进行测试。如果出现下图所示,则表示配置成功。此步骤熟悉Java的同学应该比较熟悉。 二.Python基础语法 关于Python 的基础教程网上有很多,我的看的电子书。 推荐《Python核心编程(第二版)》,大家可以去电驴下载电子版。Python是弱类型语言,对Javascript比较熟悉同学学起来应该会快一点。有人说Python不需要学习,不过我认为一些基本的API的使用还是要记得的。 这里给出一个地址:http://www.verycd.com/topics/2765155/ 三.Python 开发环境 如果觉得Python自带的IDE用着很不爽的下,有下面3个自认为比较好的第三方开发环境。 如果你是.NET开发人员用的是Visual Studio 2010或者更高版本的话,那么你可以http://pytools.codeplex.com/ 下载Python Tools for Visual Studio,然后进行安装即 可。 如果你是Java开发人员用的是Eclipse的话,那么你可以参考http://www.rose-hulman.edu/class/csse/resources/Eclipse/eclipse-python-configuration.htm这里进行Eclipse环境的搭建。 如果你想开发GUI程序的话,那么你可以Google下载boa-constructor-0.6.1.src.win32.exe 和 wxPython2.8-win32-unicode-2.8.12.1-py26.exe 这两个拓展包,前者为GUI拓展包,后者对前者提供了界面操作的支持。 如果你想开发能在没有Python环境上运行Windows GUI程序,那么你需要以下工具。 Python打包工具。Python打包工具有很多种,常用的有Pyinstaller,py2exe等,具体可以Google。后面具体介绍Py2exe的使用。 Python扩展包。Python有非常多的开源扩展包以及强大的扩展能力,一般网络编程,WEB编程,客户端编程 等 你都可以在网上找到非常丰富的资源。下面给出了一些: http://www.itlong.com/thread-1685-1-1.html from:http://www.cnblogs.com/savorboard/archive/2012/12/30/2839981.html
View Details本文用图文的方式记录了我自己搭建centos+asp.net core + docker + jexus + nginx的整个过程,希望对有同样需求的朋友有一定的参考作用。 本文主要内容如下: centos7安装 yum镜像 docker镜像 docker安装 dotnetcore安装 Docker安装dotnetcore镜像 asp.net core 创建与发布 docker中部署asp.net core jexus转发 nginx转发 1.centos7安装 a.下载centos的iso文件,比如:CentOS-7-x86_64-Everything-1611.iso b.虚拟机安装,比如:hyper-v c.手动分区: /boot 至少1G,建议2G(很多东西会装在里面,别信网上说的100M足够的话了,设置大点) /swap 2倍内存大小 / 10G吧 /home 10G以上吧 /var 至少1G,建议5G(docker很容易装满) d.软件预装,选择:带UI的Server 2.yum镜像 a.访问阿里云http://mirrors.aliyun.com b.找到你要装的OS,点右边“help”进入安装指南 c.根据指南,安装镜像(执行命令的时候请加上sudo,如果你不是root) 1 2 3 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 3.docker镜像 a. 打开开发者中心https://dev.aliyun.com/search.html b.右上角“注册/登陆” c.登陆后,右上角有一个“管理中心” d.进入管理中心,点击“加速器” 开始前先参照这个帖子《CentOS禁止packagekit离线更新服务的办法》http://www.cnblogs.com/zjoch/p/6500480.html处理,否则出现如下错误 按提示完成镜像设置 1 2 3 4 5 6 7 8 9 10 11 12 sudo curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh – 以下命令一行一行输入 sudo mkdir […]
View Details英文原文:Don’t learn to code. Learn to think 中国人常说“授之以鱼不如授之以渔”。如果说教授编程是授之以鱼,那么教授计算机科学就是授之以渔。为什么说学习计算机科学比学会编程要重要得多?来听听Yevgeniy Brikman的解释。 现如今,似乎每个人都在学习编程:Bill Gates、Mark Zuckerberg和Chris Bosh这些名人在Code.org网站上告诉人们每个人都拥有编程的能力;CoderDojo项目在世界各地大张旗鼓;英国已经把编程作为小学官方课程。 不过,我认为这样有点误入歧途了。但请不要误会——我也确实认为代码能够让世界变得更美好——但编程本身并不是我们的目的。计算机和程序只是工具,它们是我们通向终点的桥梁。 我们真正的目标应该是教会人们如何思考。换句话说,我们应该教人们计算机科学,而不只是编程。在这篇文章里,我将会解释这两者之间的区别,以及为什么在这两者当中选择正确的一方对于迈向成功来说如此重要。 我们不妨先问自己一个问题:为什么我们要关心编程或计算机科学? 欢迎来到真实的世界 或许你正在使用Chrome或Firefox阅读这篇文章,这些浏览器可能运行在Windows或macOS上,而你可能正在使用笔记本或台式机。你今天可能花了一些时间阅读电子邮件、查看朋友圈的状态,或者在视频网站上看了一些视频。我们的生活在很大程度上依赖了计算机:我们的医疗记录保存在数据库里;我们的简历可能放在了LinkedIn上;我们使用Google或Facebook为产品做宣传;我们在Amazon上购买这些产品;我们直接在网络上进行报税;我们使用网上电子银行;我们甚至开始涉足电子货币。 现在将你的视线从电脑上移开:在你的口袋里或者桌角的某个地方可能放着你的手机,它装有GPS、摄像头、触摸屏和大量的应用程序。在你的客厅,可能有LCD电视机、DVR、DVD播放机、Apple TV、Xbox或PlayStation。这些设备上的视频、音乐和游戏都是由计算机图形和数字音频组成的。 当你经过你的汽车时,你是否想过,现代汽车是使用软件设计并在满布机器人和计算机的工厂里生产出来的?你开着车,使用Google地图导航,在Yelp上查找吃饭的地方或在TripAdvisor上查找休息的地方。在你的头顶上方有自动驾驶的飞机飞过,飞机里有Wifi和娱乐系统,可以与其他飞机、交通指挥中心和飞机厂商联系。再往上,卫星和太空站正围绕着地球绕圈,它们拍照、预报天气、转发电话信号。 软件正在吞噬着这个世界,但这只不过是个开始。在你意识到这一点之前,你可能已经穿上了智能可穿戴设备、使用电脑来锁门、使用机器人来送货或清理房间、开发自己的电子设备、有自己的制造车间、生活在虚拟现实里、乘坐自动驾驶的汽车,甚至飞向太空。 矩阵无处不在 上述的这些科技都是由软件驱动的,我们的生活被代码所包围,而代码的数量在未来只会不断增加。 不过,虽说科技无处不在,但这并不意味着你在学校里就一定要学习这些技术。比方说,我们都需要乘坐飞机,但即使是K12也并没有把获得飞行员驾照当作课程的一部分。 相反,学会使用那些能够帮助你理解飞行原理的工具却是课程的一部分: 通过学习物理和数学,你了解了重力、作用力、压力、速度、摩擦力和浮力。 通过学习生物,你明白了人体在缺氧和寒冷的高空中会发生什么。 通过学习历史,你知道了飞机是怎样被发明和制造出来的,以及飞机在旅行、商务和战争中所扮演的角色。 中学毕业之后,你就知道飞机是什么东西,知道飞机是如何飞行的,以及如何安全地搭乘飞机。一般性的课程,如物理、数学、生物和历史,它们教会你如何思考各个领域的问题,包括飞机在内。相反,有些课程只是教会你如何使用一种工具,比如如何驾驶某种型号的飞机。 类似的,我们应该专注于教授计算机科学,而不仅仅是编程:前者能够教会我们一般性的思考方式,而后者只是一种特定的工具。 什么是计算机科学? 计算机科学就是研究计算:如何表示和处理信息。 解决问题:你将学会各种算法策略,比如分而治之法、递归、探索法、贪婪搜索和随机算法,它们可以帮你分解和解决任何一种问题。 逻辑:你开始使用更准确和正式的方式进行思考,比如抽象、布尔逻辑、数字理论和集合理论,你因此能够以一种严谨的方式来解决问题。 数据:你接触到信息理论,想要了解信息是什么东西,你该如何表示它们,以及如何对这个真实的世界进行建模。 系统:你该如何设计和实现复杂的系统来满足一系列的需求?系统工程几乎已经成为各个业务领域的核心议题。 思考:了解人类思维的最好途径就是尝试复制它。人工智能、机器学习、计算机视觉和自然语言处理不仅仅是计算机科学的前沿技术,它们也涉及到了生物学、物理学、心理学和数学。 上述的清单并没有提及编程或者程序,因为它们只是计算工具:它们都不是计算机科学。 在计算方面,我们更多地依赖另一个工具:我们的大脑!计算机科学的目的是教会我们的大脑进行创新性、一般性和广泛性的思考。随着科技的日益渗透,新的思考方式变得和物理、数学、生物和历史一样重要。 也就是说,只进行单独的思考是不够的:我们需要知道如何应用我们的思考。在物理学里,我们使用天平、棱镜和磁铁做实验;在生物学里,我们使用试管、植物和有盖培养皿;在计算机科学里,我们学习编程。 什么是编程? 编程,或者说写代码,是指你发出指令让计算机执行一些操作。如果你之前从来没有写过代码,那么你可能习惯了使用已有的应用程序来与计算机发生交互。实际上,这些应用程序是由代码组成的,这些代码告诉计算机如何显示应用、在哪里存储数据、从哪里获取数据,以及如何对用户的鼠标点击做出响应。 编程是基于上述的计算机科学原则进行的。计算机科学的概念——逻辑、算法、数据和系统工程——可以用于构建所有的事物,从Web浏览器到飞机的自动驾驶软件。编程涉及到数学和数据结构,同时也是一项具有创造性的活动:每敲出一行代码,你的想法就又向现实迈近了一步。 将编程作为计算机科学的一部分带来了很多好处。 DIY:如果你会编程,你就可以自己开发软件。你可以从简单的开始:写一个脚本来重命名照片或写一个Excel公式来计算税金。然后更进一步:搭建一个网站;为你的公司开发一个移动应用;开发一款可以与你的朋友们一起玩的游戏。 问题诊断:在开发了几款应用之后,就可以轻松地理解其他的应用。在战胜了对计算机的恐惧之后,你将成为技术大神。技术遍布我们的生活,知道如何操纵它们变得与知道如何使用它们一样重要。 职业生涯:学习计算机科学的目的并不是为了成为专业的程序员。我们每个人在学校里都学习数学、物理和化学,但并不是每个人都成为专业的数学家、物理学家或化学家。不过,如果你有这方面的热情,你会发现软件工程是一份高评价、高收入、增长快速的工作。 总结 让我们回顾一下: 计算机科学代表了一种新的思考方式。在一个被技术渗透的世界里,计算机科学的概念对于每一个人来说都是非常有用的。 编程是学习计算机科学的一种途径,但它本身并不具备一般性目的。 混淆了这两者就会让学习编程偏离正确的方向。Slate写过“或许不是每个人都要学习编程”的文章,Atlantic也写过“新闻学院没必要要求学生记者学会编程”的文章,而Jeff Atwood在他的文章“请不要学习编程”中问了一个问题,这个问题就是混淆概念的例子: 如果有一天,Michael Bloomberg在早上醒来时发现自己变成了一个Java编程高手,对于这个领导着美国最大城市的大人物来说,他的日常工作是否会如虎添翼? 当然,这个问题本身就是有问题的。这要归因于人们将学习编程作为终极目标,而不是学习如何思考。即使是Jeff Atwood这位经验丰富且倍受尊敬的程序员尚且分不清楚其中的区别,就别指望一般人能够搞清楚问题的实质了。我们应该这么问: 如果Bloomberg通过学习新的解决问题策略和掌握更好的逻辑领悟技能来改进他的思考方式,那么他在日常工作中是否会变得更好? 我想答案是显而易见的。随着技术越来越广泛地渗透到我们生活的各个方面,答案会越来越明显。这就是为什么我们要专注于教授计算机科学而不只是教授如何编程的原因。 from:http://kb.cnblogs.com/page/572854/
View Details前言 在上篇文章中,主要介绍了 Dotnet Core Run 命令,这篇文章主要是讲解如何在 asp.net core 中对我们的已经完成的程序进行发布和部署。 有关如何使用 Nginx 进行部署,请参见本人的另一篇文章: http://www.cnblogs.com/savorboard/p/dotnet-core-publish-nginx.html 目录 安装 Liunx DotNet 环境 新建一个 Web 项目,并发布 使用 Jexus 进行反向代理 安装 Linux DotNet 环境 安装 dotnet 环境参见官方网站 https://www.microsoft.com/net/core#ubuntu。 新建一个 WebApp 项目,并发布 在 Asp.Net Core 项目中,我们使用 dotnet new -t WebApp 命令和创建一个新的空的 Web 应用程序,然后使用dotnet resotre还原 Nuget。 主要是用以下几个命令: mkdir HelloWebApp 这个命令是创建一个名为 HelloWebApp 的文件夹。 dotnet new -t Web 这个命令是使用 Web 模板来新建一个 WebApp 的 Mvc 应用程序。 新建了应用程序之后,使用dotnet restore 和 dotnet run 命令来测试一下我们的应用程序。 我们打开浏览器输入 http://localhost:5000,来看一下效果。 可以看到已经成功运行了。 如果发布应用程序,我们需要使用 dotnet publish命令,通过使用 --help 参数可以看到一些可以使用的命令参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-f|--framework <FRAMEWORK> Target framework to compile for -r|--runtime <RUNTIME_IDENTIFIER> Target runtime to publish for -b|--build-base-path <OUTPUT_DIR> Directory in which to place temporary outputs -o|--output <OUTPUT_PATH> Path in which to publish the app --version-suffix <VERSION_SUFFIX> Defines what `*` should be replaced with in version field in project.json -c|--configuration <CONFIGURATION> Configuration under which to build --native-subdirectory Temporary mechanism to include subdirectories from native assets of dependency packages in output --no-build Do not build projects before publishing |
我们运行dotnet publish -o ~/WorkSpace/publish 发布到 publish 文件夹,当看到Published 1/1 projects successfully的时候,说明已经发布成功了。 PS: 如果提示没有安装 NPM 工具,运行sudo install apt-get npm -g,先安装 NPM。 如果提示没有 […]
View Details前言 在上篇文章中,主要介绍了 Dotnet Core Run 命令,这篇文章主要是讲解如何在Linux中,对 Asp.Net Core 的程序进行发布和部署。 有关如何在 Jexus 中进行部署,请参见本人的另一篇文章: http://www.cnblogs.com/savorboard/p/dot-net-linux-jexus.html 目录 新建一个 WebApp 项目 发布到 Linux,Mac OS 使用 Nginx 进行反向代理 新建一个 WebApp 项目 在 Asp.Net Core 项目中,我们使用 dotnet new -t WebApp 命令和创建一个新的空的 Web 应用程序。 以下是我在 Mac 中的截图: 主要是用以下几个命令: mkdir HelloWebApp 这个命令是创建一个名为 HelloWebApp 的文件夹。 dotnet new -t Web 这个命令是使用 Web 模板来新建一个 WebApp 的 Mvc 应用程序。 新建了应用程序之后,使用dotnet restore 和 dotnet run 命令来测试一下我们的应用程序。 可以看到已经成功运行了。 我们打开浏览器输入 http://localhost:5000,来看一下效果。 ps: Safari 下面,浏览器地址栏看不到端口号,实际上是5000端口。 发布到 Linux,Mac OS 如果发布应用程序,我们需要使用 dotnet publish命令,通过使用 --help 参数可以看到一些可以使用的命令参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-f|--framework <FRAMEWORK> Target framework to compile for -r|--runtime <RUNTIME_IDENTIFIER> Target runtime to publish for -b|--build-base-path <OUTPUT_DIR> Directory in which to place temporary outputs -o|--output <OUTPUT_PATH> Path in which to publish the app --version-suffix <VERSION_SUFFIX> Defines what `*` should be replaced with in version field in project.json -c|--configuration <CONFIGURATION> Configuration under which to build --native-subdirectory Temporary mechanism to include subdirectories from native assets of dependency packages in output --no-build Do not build projects before publishing |
我们直接运行dotnet publish 使用默认的发布路径,当看到Published 1/1 projects successfully的时候,说明已经发布成功了。 接着进入到 bin 文件夹下的Debug 文件夹下的netcoreapp1.0 文件夹,然后会看到有一个 publish 的文件夹。这就是默认发布生成的文件夹,在这个文件夹中可以看到我们程序所有依赖的程序集文件。 发布之后 publish 文件夹里面的子文件夹有必要说明一下。
1 2 3 4 5 |
appsettiong.json 应用程序的配置文件 refs 应用程序引用的.net fx系统程序集 runtimes 运行时环境,可以看到里面的文件夹包含 win7、linxu,mac os 等,说明我们这个应用程序是跨平台的。 views 这个文件夹存放的就是我们的 mvc 的视图文件。 wwwroot 文件夹,存放的是前端使用的 js 库,css 样式表,和图片等。 |
然后我们把工作目录切换到发布的 publish 文件夹。使用dotnet […]
View Details前言 上篇博文介绍了怎么样在 asp.net core 使用 Redis 和 Protobuf 进行 Session缓存。本篇的是开发过程中使用的一个小功能,怎么做单文件和多文件上传。 如果你觉得对你有帮助的话,不妨点个【推荐】。 目录 单文件上传 多文件上传 示例源码 单文件上传 上传文件在Web应用程序中是一个常见的功能。在asp.net core中上传文件并保存在服务器上,是很容易的。下面就来演示一下怎么样在 ASP.NET Core项目中进行文件上传。 首先,创建一个 asp.net core 项目,然后在Controller文件件添加一个HomeController,然后在 Views 文件夹的 Home 文件夹里添加一个 New.cshtml 视图文件。如下图: 添加一个 UserViewModel.cs在 Model 文件夹中 , 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class UserViewModel { [Required] [Display(Name = "姓名")] public string Name { get; set; } [Required] [Display(Name = "身份证")] [RegularExpression(@"^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$", ErrorMessage = "身份证号不合法")] public string IdNum { get; set; } public string IdCardImgName { get; set; } [Required] [Display(Name = "身份证附件")] [FileExtensions(Extensions = ".jpg,.png", ErrorMessage = "图片格式错误")] public IFormFile IdCardImg { get; set; } } |
然后添加一个 New.cshtml 视图文件在 Views 文件夹中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@model UserViewModel <form asp-controller="Home" role="form" asp-action="New" enctype="multipart/form-data" method="post"> <div class="form-group"> <label asp-for="Name"></label> <input type="text" class="form-control" asp-for="Name" /> </div> <div class="form-group"> <label asp-for="IdNum"></label> <input type="text" class="form-control" asp-for="IdNum" /> </div> <div class="form-group"> <label asp-for="IdCardImg"></label> <input type="file" asp-for="IdCardImg" /> <p class="help-block">上传。</p> </div> <button type="submit" class="btn btn-default">提交</button> </form> |
在 HomeController 中,添加页面对应的 Action 方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[HttpPost] public IActionResult New([FromServices]IHostingEnvironment env, [FromServices]AppDbContext dbContext, UserViewModel user) { var fileName = Path.Combine("upload", DateTime.Now.ToString("MMddHHmmss") + ".jpg"); using (var stream = new FileStream(Path.Combine(env.WebRootPath, fileName), FileMode.CreateNew)) { user.IdCardImg.CopyTo(stream); } var users = dbContext.Set<User>(); var dbUser = new User() { Name = user.Name, IdCardNum = user.IdNum, IdCardImgName = fileName }; users.Add(dbUser); dbContext.SaveChanges(); return RedirectToAction(nameof(Index)); } |
运行程序,查看表单: 多文件上传 多文件上传和单文件上传类似,表单的 ViewModel 使用 ICollection<IFromFile> ,然后表单的<input type="file" asp-for="IdCardImg" mulpitle /> 添加上mulpitle就可以了(只支持 H5)。 示例源码 注:示例数据存储使用的 Sqlite ,Code First方式生成数据库。 示例代码已经上传至 github: https://github.com/yuleyule66/AspNetCoreFileUpload 本文地址:http://www.cnblogs.com/savorboard/p/5599563.html 作者博客:Savorboard 欢迎转载,请保留出处
View Details