独立使用Asp.net Core 的razor模板 (一):Razor引擎的一些细节
由于最近需要写一些界面稍微好看点的Winform程序,如果用原生控件,,想要达到好看的程度,需要花费比较大的功夫,因为之前使用过CefSharp,因此发觉如果是使用CEF+Html的方式,界面可以相对容易做的精致一点(其实就是设计完之后,找个前端人员切切图),但是,使用CEF+Html有个弊端就是,正常的软件,Header跟Footer大体是通用的,包括一些通用的js/css的引用以及菜单栏等等,,如果直接用html,有个问题就在于,,每个界面都要复制一遍,如果万一发生修改,每个页面又要来一次,或许都这里有朋友会说:"那可以使用vue或者ng的模板啊",,实际情况是,,会用的人不多,但是会用jq的人大把.
由于服务器端有Razor模板,可以很方便的使用Layout以及各种自己封装的View,但实际情况下,如果单独把Razor拿出来,实际上是只有将模板string+model解析成新的string的功能而已,因此,想要独立的使用Razor就需要为独立的Razor引擎补充一些功能,
首先需要补充的就是Layout功能
开始动工之前,我们先来了解一下一些功能对应到Razor中,是怎么个实现方式的:
1.先来看一段简单的cshtml文件以及生成后的类:
_Layout.cshtml
<html>
<head>
<title></title>
</head>
<body> @RenderBody() @RenderSection("test",false) </body>
</html>
Index.cshtml
@{
Layout = "_Layout.cshtml";
} <p>sdfsdfsdfs</p> @section test{
<p>ddddddddd</p>
}
Index.cshtml生成后的代码:
#pragma warning disable 1591
namespace TEst
{
#line hidden
using System;
using System.Threading.Tasks;
public class TextFile1 : WindowsFormsApp2.RazorViewBase<WindowsFormsApp2.Model>
{ #pragma warning disable 1998
public async override global::System.Threading.Tasks.Task ExecuteAsync()
{
WriteLiteral("\r\n\r\n");
WriteLiteral("\r\n");
#line 5 "TextFile1.cshtml" Layout = "sdfsdfsdfsf"; #line default
#line hidden
WriteLiteral("\r\n<html>\r\n<head>\r\n <title></title>\r\n</head>\r\n<body>\r\n");
DefineSection("ui", async () =>
{
WriteLiteral("\r\n ");
#line 15 "TextFile1.cshtml"
Write(Model.A1); #line default
#line hidden
WriteLiteral(";\r\n ");
#line 16 "TextFile1.cshtml"
Write(Model.A1?.StartsWith("sfdsfdf")); #line default
#line hidden
WriteLiteral("\r\n <p></p>\r\n ");
}
);
WriteLiteral("</body>\r\n</html>");
}
#pragma warning restore 1998
}
}
#pragma warning restore 1591
1.关于基类,Razor引擎可以设置本次生成的类的基类,并且,要求基类中需要实现几个函数,已供生成的子类调用
2.@section : 如果使用section关键字,编译后,其实是调用基类的DefineSection(string name, Func<Task> act)函数,
如:在Layout 中,使用 Html.RenderSesction 函数输出
那么在引用该Layout的页面中,如Index.csthml中,使用
@section header{
sdfsdfsdfsdfs
//TODO:其他需要输出在头部的标签
}
对应到实际生成的代码,其实是这样的
DefineSection("header", async () =>
{
WriteLiteral("\r\n ");
#line 15 "TextFile1.cshtml"
Write(Model.A1); #line default
#line hidden
WriteLiteral(";\r\n ");
#line 16 "TextFile1.cshtml"
Write(Model.A1?.StartsWith("sfdsfdf")); #line default
#line hidden
WriteLiteral("\r\n <p></p>\r\n ");
}
)
由生成的代码可以看到 ,@section 段的使用,需要基类实现 DefineSection(string name, Func<Task> act) 函数,并且将传入的函数存起来,等待Html.RenderSesction 触发时调用
3.RenderBody,该函数其实是直接把Index.cshtml中,非@section的部分直接输出,由ExecuteAsync函数开始,所有的WriteLiteral的结果总和,因为@section部分已经是通过DefineSection定义了,所以直接输出其他结果并不会干扰到
4.WriteLiteral和Write: WriteLiteral 直接输原始数据,Write除非是输出HtmlString,否则需要转码
5.ExecuteAsync函数:Razor其实上是把cshtml转成对ExecuteAsync函数的内容
6.VS 的IDE支持,,由于.net core 3.0还未出正式版.所以创建的项目为.net 4.5的,而引用的又是asp.net core 的Razor,所以在IDE支持上会有一点点的小区别:
因此为了省的IDE报太多的错误,需要在基类中,添加几个用于糊弄IDE的函数和属性:
public HttpContextFake Context { set; get; } //返回自己模拟的一个HttpContext的类,
protected virtual void DefineSection(string name, Action act) //函数签名略微不同
public virtual void Execute() //IDE认的就是这个函数,不存在会报错,但没有实际用途 [Browsable(false),Obsolete]
public class HttpContextFake
{
public System.Web.HttpApplication ApplicationInstance { get; }
}
顺带附上Razor+NaneUI的项目的地址: https://gitee.com/kugar/Kugar.UI.RazorUI
以上是Razor一些小的细节,,下篇文章就开始来说怎么创建一个支持Layout的独立Razor了
独立使用Asp.net Core 的razor模板 (一):Razor引擎的一些细节的更多相关文章
- 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用
前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- 如何在ASP.NET Core 2.0中使用Razor页面
如何在ASP.NET Core 2.0中使用Razor页面 DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...
- 从ASP.Net Core Web Api模板中移除MVC Razor依赖项
前言 :本篇文章,我将会介绍如何在不包括MVC / Razor功能和包的情况下,添加最少的依赖项到ASP.NET Core Web API项目中. 一.MVC VS WebApi (1)在ASP. ...
- Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 )
refer : https://dotnetcoretutorials.com/2017/08/20/sending-email-net-core-2-0/ https://ppolyzos.com/ ...
- 如何增加Asp.Net Core生成的模板网站中用户信息表中的列(AspNetUsers)
环境: 1.VS2015 Community 14.0.25431.01 Update 3; 2.其他环境(具体哪一个影响不太清楚,都列在这儿) 使用的系统模板 利用系统提供的模板,并选择个人身份验证 ...
- ASP.NET CORE 2.0 模板 (Admin LTE)
原文:https://www.jianshu.com/p/4916f380be66?utm_campaign=hugo&utm_medium=reader_share&utm_cont ...
- ASP.NET Core Razor Pages 初探
最近新建 Asp.net Core MVC 项目的时候不小心选错了个模板,发现了一种新的项目模板.它使用cshtml视图模板,但是没有Controller文件夹.后来才发现这是ASP.NET Core ...
- ASP.NET Core Web App应用第三方Bootstrap模板
引言 作为后端开发来说,前端表示玩不转,我们一般会选择套用一些开源的Bootstrap 模板主题来进行前端设计.那如何套用呢?今天就简单创建一个ASP.NET Core Web MVC 模板项目为例, ...
随机推荐
- HDU - 1078 FatMouse and Cheese (记忆化搜索)
FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension ...
- 机器学习之正则化【L1 & L2】
前言 L1.L2在机器学习方向有两种含义:一是L1范数.L2范数的损失函数,二是L1.L2正则化 L1范数.L2范数损失函数 L1范数损失函数: L2范数损失函数: L1.L2分别对应损失函数中的绝对 ...
- Ajax与JSON共同使用的小实例
实现的效果: 点击“点击”按钮,可以通过Ajax从服务器调过来相应的文档文件,而不需重新加载页面. 通过json可以将调过来的文档(String)转换为相应的json对象,从而对文档中数据进行操作. ...
- java调用matlab绘图
一 注意事项 1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder). 2: 运 ...
- DirectX11 With Windows SDK--08 Direct2D与Direct3D互操作性以及利用DWrite显示文字
前言 注意:从这一章起到后面的所有项目无一例外都利用了Direct2D与Direct3D互操作性,但系统要求为Win10, Win8.x 或 Win7 SP1且安装了KB2670838补丁以支持Dir ...
- DirectX11 With Windows SDK--19 模型加载:obj格式的读取及使用二进制文件提升读取效率
前言 一个模型通常是由三个部分组成:网格.纹理.材质.在一开始的时候,我们是通过Geometry类来生成简单几何体的网格.但现在我们需要寻找合适的方式去表述一个复杂的网格,而且包含网格的文件类型多种多 ...
- PyQt5之布局管理
目录 一 写在开头 1.1 本文内容 二 绝对布局 三 布局类 3.1 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout) 3.2 水平布局和垂直布局实例 3.3 网格布局(QGr ...
- 简单管理员权限与几个常用的PHP 常用函数,in_array(),explode(),implode(),join(),str_replace()
先把今天要用的几个函数罗列出来: //explode()转换成数组,implode()转化成字符串 explode("分隔符",需要被分割的字符串或变量) $priv=" ...
- 入门嵌入式选择2440?树莓派?STM32?4412开发板?
如果了解一下当前IT和物联网发展的形势,就会发现Android工程师越来越受欢迎,相比之下单纯的Linux工程师却逊色不少,当然,Android系统的内核也是Linux的,Linux和Android作 ...
- Codeforces 1100F(线性基+贪心)
题目链接 题意 给定序列,$q(1\leq q \leq 100000) $次询问,每次查询给定区间内的最大异或子集. 思路 涉及到最大异或子集肯定从线性基角度入手.将询问按右端点排序后离线处理询问, ...