ASP.NET Core 十种方式扩展你的 Views

原文地址: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里面,来让它具有动态的内容。但是ViewBagViewData都是弱类型的,所以没有智能提示,用起来略不爽。

要在你的视图中使用强类型数据对象,你需要定义一个Model来在视图中使用。

@model ExtendViews.ViewModels.AboutModel<!-- usage: --->@Model.FullName

这种方式是不是很常见的? 下一种方式是一个更好的方式来布局我们的视图:

#2:布局(Layouts):

相当于ASP.NET的WebForms的母版页,不过它是定义Razor视图的基本布局的一种方式。它就是_Layout.cshtml, 位于 Views\Shared\ 文件夹里 。通常情况下这个文件通常包含HTML的header,body和公用的一些东西。你可以多建几个互相进行组合,来完成整个站点的布局。其他页面引用布局视图页的时候,是这样子写的(注意不需要扩展名):

@{Layout = "_Layout";
} 

此调用需要在您的视图的第一行中。但你不需要在每一个视图中定义布局,如果你使用Visual Studio新建一个ASP.NET Core项目,Views文件夹有一个_ViewStart.cshtml,在运行的时候它会自动的导入到每个视图中去。

_Layout.cshtml有一个方法法叫 RenderBody(),它就是用来渲染详细的视图页到模板布局视图中:

@RenderBody()

在此方法的位置,详情视图就会被渲染到这里。

#3: 区域(Sections)

有时候子视图中想在主视图中显示一部分html代码,比如javascript代码或者是css,这个时候就可以使用Sections,通常情况下在页面的结尾部分。

在主视图中(_Layout.cshtml)定义一个Javascripts Section:

@RenderSection("scripts", required: false)

有一个required参数来声明这个Section是否必须的。然后你就可以在子视图中这样使用:

@section scripts {    <script>        $(function() {            // some more js code here;        });    </script>}

如果你使用嵌套的布局,你可能需要嵌套这个区域。意思就是你在Section里面嵌套调用RenderSection():

@section scripts
{    @RenderSection("scripts", required: false)
}

#4: 分部视图( PartialViews)

你可以提取html页面中重用的部分,把它放到一个新的Razor视图中,这个视图没有自己的Action,这种视图就叫做分部视图。 分部视图通常也在Views\Shard\文件夹。

分部视图同样也可以是一个数据视图,它可以从父视图中获取数据(但不是必须的):

@model IEnumerable<UserModel>
@if (Model.Any())
{<ul>@foreach (var user in Model){<li>@user.FullName</li>}</ul>
}

这个分部视图需要从父视图中获取用户列表的数据

@{ await Html.RenderPartialAsync("Users", Model.Users);}

如果你的分部视图没有定义用户模型,你就不需要传第二个参数。

#5:视图组件(ViewComponents)

这个 ASP.NET Core特有的。

译者注:类似于以前的用户控件

有时候你需要做一些分部视图的事情,但是又包含一些业务逻辑在里面。在过去,你可以使用ChildAction渲染结果到一个视图中,但是,在 ASP.NET Core中,有一种新的方式来做这件事情,它就是ViewComponents(我已经写了一篇关于ViewComponents的博文)。它类似于在MVC中的一种迷你的MVC,也就是说他们可以有自己的Controller,和单个的action以及view。ViewComponents是完全独立于你的当前视图的,但是可以通过你当前的视图传输数据。

想这样调用它,来渲染一个ViewComponents:

@Component.Invoke("Top10Articles");

可以看我的博客来学习怎么创建自己的ViewComponent

请在我的预览后viewcomponent一看学习如何创建你自己的。

#6: HTML助手(HtmlHelpers)

HTMLHelper类中,你可以创建你自己的扩展方法来扩展Razor语法:

public static class HtmlHelperExtensions{    public static HtmlString MyOwnHtmlHelper(this HtmlHelper helper, string message)    {        return new HtmlString($"<span>{message}<span>");}
}

在你的视图中,创建一个可重用的部分是非常有用的,它比分部视图多包含了一些业务逻辑。比HTMLHelpers扩展更好的是新的TagHelpers,但是在扩展你视图的时候,HTMLHelpers仍然有它自己的一些适用的地方。

#7: 标签助手(TagHelper)

这是 ASP.NET Core 非常好的一个新特性。

一个扩展你视图的小助手,它看起来像一个原生的HTML标签一样。 在ASP.NET Core MVC中你应该使用 TagHelpers 来替换 HtmlHelpers,因为它们更加的简洁和容易使用。另一个巨大的好处就是依赖注入,在HtmlHelpers中是使用不了的,因为HtmlHelpers 扩展的都是静态内容。 但TagHelpers是一个公共类,我们可以很容易的在它的构造函数中注入服务。

下面是一个很简单的小示例,来展示怎么样定义一个TagHelper:

[TargetElement("hi")] 
public class HelloTagHelper : TagHelper { public override void Process(TagHelperContext context, TagHelperOutput output)    { output.TagName = "p"; output.Attributes.Add("id", context.UniqueId); output.PreContent.SetContent("Hello "); output.PostContent.SetContent(string.Format(", time is now: {0}",  DateTime.Now.ToString("HH:mm"))); } 
}

这里定义了一个叫做hi的标签,它以HTML标记来呈现,p标签的内容是当前时间。

使用:

<hi>John Smith</hi>

结果:

<p>Hello John Smith, time is now: 18:55</p>

ASP.NET Core MVC 已经默认提供了很多TagHelpers来替换以前的HtmlHelpers。例如ActionLink已经被新的TagHelper所替换:

@Html.ActionLink(“About me”, “About”, “Home”)

新的TagHelper像这样来创建一个link:

<a asp-controller=”Home” asp-action=”About”>About me</a>

以上两种方式来创建一个a标签的结果:

<a href=/Home/About”>About me</a>

可以看到,TagHelpers看起来更像原生的HTML,他们在视图中更加的直观,更高的可读性,并且更容易使用。

#8: 依赖注入(Dependency Injection)

这也是ASP.NET Core的新特性。

在扩展你的视图的时候,可以使用依赖注入了,这是一个非常大改进。是的,你可以在你的视图中使用DI了。

在StackOverflow和reddit有人这样问?
这真的有意义吗? 这不是会搞乱我的视图吗? 这不是与MVC模式背离吗?

我认为,不是这样的。 的确,在真正需要的地方你才使用,并且,你使用的时候需要非常小心。 有这样一个有效的场景:你创建一个表单来编辑用户的资料信息(User Profile), 用户可以添加他的公司位置,地址, 国家城市等等,我不愿意从Action到View中传输公司位置 ,地址和国家城市。我只愿意通过用户资料本身(User Profile), 我只想在 Action 中处理用户资料(User Profile)。这时候可以注入服务来给我查询数据,这就是为什么这种情况下它是非常有用的。它可以让我们的Action和ViewModel 保持非常的干净。

Startup.cs中的ConfigureServices来注册你具体的服务,然后你就可以在视图中这样来使用,只需要一行代码:

@inject DiViews.Services.ICountryService CountryService;

现在你可以在你的视图中使用ContryService来填充国家下拉列表。

我在这篇博客中写了很多关于依赖注入的博文。

#9: 函数(Functions)

在一个ASP.NET MVC 项目中,我从来没有真正的使用过函数这个功能。我只在一个Umbraco的CMS系统中用过一次。不管怎么说,这也是扩展你视图的另一种小技巧。也许你有很复杂视图方面的业务逻辑,在这种情况下,你可以在你的视图中写C#方法:

@functions{    public string ReverseString(string input){        return String.Join("", input.Reverse());}
}

#10: 配置全局视图(Global view configuration)

最后一点,你可以在_ViewImports.cshtml文件中,来配置你其他视图中使用的一些比较公用的 using 引用,依赖注入等。

总结

不管是以前的MVC还是新的的Core的MVC, 都有很多方法来扩展视图,虽然扩展这些视图的方式有些类似,但是每一种都有它最适合的地方,所以我们在使用这些特性来解决我们的问题的时候,我们应该多加思考,找到最合适的方式。

译者注:本文翻译并非逐字翻译,由于水平有限,难免出现一些错误和翻译不准确的地方,希望读者能够指出并堪正,不胜感激。

相关文章:

  • 微软.NET 正式劈腿成功,横跨所有平台

  • .NET Core 1.0 CentOS7 尝试

  • 解读发布:.NET Core RC2 and .NET Core SDK Preview 1

  • [.NET Core].NET Core R2安装及示例教程

  • ASP.NET Core 开发-中间件(Middleware)

  • 结合Jexus + Kestrel 部署 asp.net core 生产环境

  • 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

  • ASP.NET Core 中文文档 第一章 入门

  • 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

  • 用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

  • 用 Visual Studio 发布一个 Azure 云 Web 应用程序

  • ASP.NET Core MVC 与 Visual Studio 入门

  • 第二章指南(4.2)添加 Controller

  • DotNet Core 介绍

  • asp.net core 中间件详解及项目实战

  • 教你实践ASP.NET Core Authorization(免看文档教程)

  • asp.net core 使用 Redis 和 Protobuf 进行 Session 缓存

  • asp.net core 中间件详解及项目实战

  • 第二章 指南(4.3)添加 View

  • dotnet core开发体验之开始MVC

  • dotnet core 开发体验之Routing

  • 聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer

  • 简析.NET Core 以及与 .NET Framework的关系

  • .NET Core 使用Dapper 操作MySQL

  • 使用 CommandLineApplication 类创建专业的控制台程序

  • 简析 .NET Core 构成体系

  • .NET Core也可以使用MongoDB了

  • .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布

  • .NET Core:面向未来的开源跨平台开发技术

  • 微软说它深爱着Linux,现在它用行动证明了

  • 移植.NET Core计划,整合各平台变得更简单了!

  • ASP.NET Core 介绍

  • 通过几个Hello World感受.NET Core全新的开发体验

  • ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

  • .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

  • Asp.Net Core 发布和部署( MacOS + Linux + Nginx )

  • Asp.Net Core 发布和部署(Linux + Jexus )

  • 学习ASP.NET Core,你必须了解无处不在的“依赖注入”

  • .NET Core应用类型(Portable apps & Self-contained apps)

  • .NET Core 1.0发布:微软开源跨平台大布局序幕

  • ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

  • 在Windows Server 2012 R2 Standard 部署 ASP.NET Core程序

  • ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

  • 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc

  • 使用 dotnet watch 开发 ASP.NET Core 应用程序

  • ASP.NET Core 发布至Linux生产环境 Ubuntu 系统

  • ASP.NET Core Docker部署

  • ASP.NET Core "完整发布,自带运行时" 到jexus

  • 全球首发免费的MySql for Entity Framework Core

  • ASP.NET Core开发-使用Nancy框架

  • .NET Core全新路线图

  • 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题

原文地址:http://www.cnblogs.com/savorboard/p/aspnetcore-views.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

转载自 JVM内存管理------GC算法精解&#xff08;五分钟让你彻底明白标记/清除算法&#xff09;相信不少猿友看到标题就认为LZ是标题党了&#xff0c;不过既然您已经被LZ忽悠进来了&#xff0c;那就好好的享受一顿算法大餐吧。不过LZ丑话说前面哦&#xff0c;这篇文章应该能让…

鸿蒙 电视 安卓,华为鸿蒙2.0来了!打通手机、电视、PC全平台,Mate 40 整装齐发...

华为鸿蒙2.0来了&#xff01;打通手机、电视、PC全平台&#xff0c;Mate 40 整装齐发2020-07-05 15:52:041点赞0收藏1评论7月5日消息&#xff0c;据国外知名爆料玩家 Teme 透露&#xff0c;华为今年秋季发布会上除了将发布华为 Mate 40 系列旗舰机型外&#xff0c;还将带来 EMU…

跳槽穷半年,改行穷三年,说的太好了!

跳槽穷半年&#xff0c;改行穷三年。献给每天喊辞职、想辞职的人或周期性喊辞职、想辞职的人&#xff01; 1 不要轻易离开团队&#xff0c;否则你要从零做起 。2 不要老想着做不顺就放弃&#xff0c;哪个团队都有问题&#xff0c;哪个团队都有优点。3 .跟对领导很重要&#xff…

JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

转载自 JVM内存管理------GC算法精解&#xff08;五分钟教你终极算法---分代搜集算法&#xff09;引言何为终极算法&#xff1f;其实就是现在的JVM采用的算法&#xff0c;并非真正的终极。说不定若干年以后&#xff0c;还会有新的终极算法&#xff0c;而且几乎是一定会有&…

android 应用程序 判断 ,如何判断Android应用程序是否正在前台运行?

慕的地6264312或者&#xff0c;您可以检查ActivityManager哪些任务正在按getRunningTasks方法运行。然后&#xff0c;检查返回的任务列表中的第一个任务(前景中的任务)是否是您的任务。这是代码示例&#xff1a;public Notification buildNotification(String arg0, Map arg1) …

在离线环境中使用.NET Core

0x00 写在开始 很早开始就对.NET Core比较关注&#xff0c;一改微软之前给人的印象&#xff0c;变得轻量、开源、跨平台。最近打算试着在工作中使用。但工作是在与互联网完全隔离的网络中进行的&#xff0c;因此就开始了在离线环境中部署.NET Core开发环境的尝试。总的来说还是…

java常量池技术

转载自 java常量池技术摘要&#xff1a; 简介 常量池在java用于保存在编译期已确定的&#xff0c;已编译的class文件中的一份数据。它包括了关于类&#xff0c;方法&#xff0c;接口等中的常量&#xff0c;也包括字符串常量&#xff0c;如String s "java"这种…

华为荣耀5a是android几,华为荣耀5a各版本区别 华为荣耀5a各版本 对比【图文】

一个多月前&#xff0c;华为发布了华为荣耀5a&#xff0c;相信不少人都对这部手机十分期待。这款产品主打Slogan是“青春好拍档”。延续了5系列的定位&#xff0c;不仅价格便宜还拥有不错的拍照及音质调教。那么华为荣耀畅玩5A有几个版本?各版本有什么区别?下面小编就带来华为…

.NET程序员走向高端必读书单汇总

如今程序开发工作越来越简单(丰富的API、智能的IDE、越来越多的开发框架)&#xff0c;普通人通过简单的训练&#xff0c;通过组合和复制就能完成众多程序的功能。因此程序员这种过去高技术职业的代名词&#xff0c;现在却如此低贱&#xff0c;被称之为码农。借用微观经济学原理…

android roboguice2,Android快速开发框架 roboguice

//使用框架前class AndroidWay extends Activity {TextView name;ImageView thumbnail;LocationManager loc;Drawable icon;String myName;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);name (TextVi…

java 为什么需要常量池

转载自 java 为什么需要常量池java中讲的常量池&#xff0c;通常指的是运行时常量池&#xff0c;它是方法区的一部分&#xff0c;一个jvm实例只有一个运行常量池&#xff0c;各线程间共享该运行常量池。 java内存模型中将内存分为堆和栈&#xff0c;其中堆为线程间共享的内存数…

.NET Core第三方开源Web框架YOYOFx

YOYOFx框架 YOYOFx是一个轻量级用于构建基于 HTTP 的 Web 服务&#xff0c;基于 .NET 和 Mono 平台。 本着学习的态度&#xff0c;造了这个轮子&#xff0c;也是为了更好的了解各个框架的原理和有点&#xff0c;还希望可以和大家多交流 。 GitHub&#xff1a;https://github.co…

JavaScript实现搜索框效果

要求&#xff1a;搜索框获取焦点的时候如果里面的内容是“请输入关键字”&#xff0c;则清空&#xff0c;否则不清空 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…

JVM调优总结(1):一些概念

转载自 JVM调优总结&#xff08;1&#xff09;&#xff1a;一些概念数据类型Java虚拟机中&#xff0c;数据类型可以分为两类&#xff1a;基本类型和引用类型。基本类型的变量保存原始值&#xff0c;即&#xff1a;他代表的值就是数值本身&#xff1b;而引用类型的变量保存引用…

android通讯录增删改查,android 通话记录的增删改查 .

//获取当前的手机号public String getLocalNumber() {Context context getApplicationContext();TelephonyManager tManager (TelephonyManager)context.getSystemService(TELEPHONY_SERVICE);String number tManager.getLine1Number();return number;}//删除通话记录privat…

使用C#进行系统编程

虽然对于系统编程&#xff08;System programming&#xff09;的定义很模糊&#xff0c;不过可以将其描述为在比特、字节、指令&#xff0c;或CPU周期层面所进行的思考。系统编程这个概念也暗含了对性能和可靠性的需求。Microsoft技术总监Joe Duffy在QCon New York活动中介绍了…

html表格转换为csv,python实现将html表格转换成CSV文件的方法

python实现将html表格转换成CSV文件的方法发布于 2015-11-18 16:53:39 | 155 次阅读 | 评论: 0 | 来源: 网友投递Python编程语言Python 是一种面向对象、解释型计算机程序设计语言&#xff0c;由Guido van Rossum于1989年底发明&#xff0c;第一个公开发行版发行于1991年。Pyth…

JVM调优总结(2):基本垃圾回收算法

转载自 JVM调优总结&#xff08;2&#xff09;&#xff1a;基本垃圾回收算法可以从不同的的角度去划分垃圾回收算法&#xff1a; 按照基本回收策略分 引用计数&#xff08;Reference Counting&#xff09;: 比较古老的回收算法。原理是此对象有一个引用&#xff0c;即增加一个…

巧妙使用信用卡N个小技巧

大家看标题也看出来了&#xff0c;今天的博文与之前的相差十万八千里&#xff0c;既不是代码&#xff0c;也不是黑科技&#xff0c;既不属于创业&#xff0c;也不属于赚钱&#xff0c;今天咱们坐下来就慢慢的谈谈信用卡吧&#xff0c;现在大多数白领&#xff0c;老板&#xff0…

ubuntu16.4下用jexus部署asp.net core rtm

今天说下ubuntu 下部署asp.net core&#xff0c;不需要安装.net core sdk&#xff0c;自带运行时方式部署&#xff0c;利用jexus服务器转发请求到asp.net core. 1.部署准备环境 vmware虚拟机&#xff08;其他也可以&#xff09; ubuntu16.04镜像 2.发布环境 win10系统 vs2015 u…