由于最近需要写一些界面稍微好看点的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引擎的一些细节的更多相关文章

  1. 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用

    前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...

  2. asp.net core系列 39 Web 应用Razor 介绍与详细示例

    一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...

  3. 如何在ASP.NET Core 2.0中使用Razor页面

    如何在ASP.NET Core 2.0中使用Razor页面  DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...

  4. 从ASP.Net Core Web Api模板中移除MVC Razor依赖项

    前言 :本篇文章,我将会介绍如何在不包括MVC / Razor功能和包的情况下,添加最少的依赖项到ASP.NET Core Web API项目中. 一.MVC   VS WebApi (1)在ASP. ...

  5. Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 )

    refer : https://dotnetcoretutorials.com/2017/08/20/sending-email-net-core-2-0/ https://ppolyzos.com/ ...

  6. 如何增加Asp.Net Core生成的模板网站中用户信息表中的列(AspNetUsers)

    环境: 1.VS2015 Community 14.0.25431.01 Update 3; 2.其他环境(具体哪一个影响不太清楚,都列在这儿) 使用的系统模板 利用系统提供的模板,并选择个人身份验证 ...

  7. ASP.NET CORE 2.0 模板 (Admin LTE)

    原文:https://www.jianshu.com/p/4916f380be66?utm_campaign=hugo&utm_medium=reader_share&utm_cont ...

  8. ASP.NET Core Razor Pages 初探

    最近新建 Asp.net Core MVC 项目的时候不小心选错了个模板,发现了一种新的项目模板.它使用cshtml视图模板,但是没有Controller文件夹.后来才发现这是ASP.NET Core ...

  9. ASP.NET Core Web App应用第三方Bootstrap模板

    引言 作为后端开发来说,前端表示玩不转,我们一般会选择套用一些开源的Bootstrap 模板主题来进行前端设计.那如何套用呢?今天就简单创建一个ASP.NET Core Web MVC 模板项目为例, ...

随机推荐

  1. HDU - 1078 FatMouse and Cheese (记忆化搜索)

    FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension ...

  2. 机器学习之正则化【L1 & L2】

    前言 L1.L2在机器学习方向有两种含义:一是L1范数.L2范数的损失函数,二是L1.L2正则化 L1范数.L2范数损失函数 L1范数损失函数: L2范数损失函数: L1.L2分别对应损失函数中的绝对 ...

  3. Ajax与JSON共同使用的小实例

    实现的效果: 点击“点击”按钮,可以通过Ajax从服务器调过来相应的文档文件,而不需重新加载页面. 通过json可以将调过来的文档(String)转换为相应的json对象,从而对文档中数据进行操作. ...

  4. java调用matlab绘图

    一 注意事项 1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder). 2: 运 ...

  5. DirectX11 With Windows SDK--08 Direct2D与Direct3D互操作性以及利用DWrite显示文字

    前言 注意:从这一章起到后面的所有项目无一例外都利用了Direct2D与Direct3D互操作性,但系统要求为Win10, Win8.x 或 Win7 SP1且安装了KB2670838补丁以支持Dir ...

  6. DirectX11 With Windows SDK--19 模型加载:obj格式的读取及使用二进制文件提升读取效率

    前言 一个模型通常是由三个部分组成:网格.纹理.材质.在一开始的时候,我们是通过Geometry类来生成简单几何体的网格.但现在我们需要寻找合适的方式去表述一个复杂的网格,而且包含网格的文件类型多种多 ...

  7. PyQt5之布局管理

    目录 一 写在开头 1.1 本文内容 二 绝对布局 三 布局类 3.1 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout) 3.2 水平布局和垂直布局实例 3.3 网格布局(QGr ...

  8. 简单管理员权限与几个常用的PHP 常用函数,in_array(),explode(),implode(),join(),str_replace()

    先把今天要用的几个函数罗列出来: //explode()转换成数组,implode()转化成字符串 explode("分隔符",需要被分割的字符串或变量) $priv=" ...

  9. 入门嵌入式选择2440?树莓派?STM32?4412开发板?

    如果了解一下当前IT和物联网发展的形势,就会发现Android工程师越来越受欢迎,相比之下单纯的Linux工程师却逊色不少,当然,Android系统的内核也是Linux的,Linux和Android作 ...

  10. Codeforces 1100F(线性基+贪心)

    题目链接 题意 给定序列,$q(1\leq q \leq 100000) $次询问,每次查询给定区间内的最大异或子集. 思路 涉及到最大异或子集肯定从线性基角度入手.将询问按右端点排序后离线处理询问, ...