由于最近需要写一些界面稍微好看点的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. 帝国CMS Table '***.phome_ecms_news_data_' doesn't exist

      帝国CMS刷新内容页出现以下错误 1 Table 'www.536831.com.phome_ecms_news_data_' doesn't exist select keyid,dokey,n ...

  2. kibana连接elasticsearch集群做负载均衡

    问题背景: 在ELK架构中,kibana一般配置连接elasticsearch的时候,配置文件中的写法一般如下: ……# The URL of the Elasticsearch instance t ...

  3. 为 Java 程序员准备的 Go 入门 PPT

    为 Java 程序员准备的 Go 入门 PPT 这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的. 视频 这个 ...

  4. 20175221 实验一《Java开发环境的熟悉》实验报告

    20175221 实验一<Java开发环境的熟悉>实验报告 (一)Linux运行结果 (二)IDEA下Java程序开发.调试:学会通过调试(Debug)来定位逻辑错误   试验IDEA是否 ...

  5. R语言统计学习-1简介

    一. 统计学习概述 统计学习是指一组用于理解数据和建模的工具集.这些工具可分为有监督或无监督.1.监督学习:用于根据一个或多个输入预测或估计输出.常用于商业.医学.天体物理学和公共政策等领域.2.无监 ...

  6. GO语言系列(二)- 基本数据类型和操作符

    一.文件名 & 关键字 & 标识符 1.所有go源码以.go结尾 2.标识符以字母或下划线开头,大小写敏感 3._是特殊标识符,用来忽略结果 4.保留关键字 二.Go程序的基本结构 p ...

  7. 前端面试题整理—jQuery篇

    1.为什么使用jquery,他有哪些好处? 1)轻量级.代码简洁 2)强大的选择器,出色的DOM操作封装 3)有可靠的事件处理机制 4)浏览器兼容性好 5)支持链式操作 6)支持丰富的插件 2.jqu ...

  8. Three ways to detect outliers

    Z-score import numpy as np def outliers_z_score(ys): threshold = 3 mean_y = np.mean(ys) stdev_y = np ...

  9. ElasticSearch评分分析 explian 解释和一些查询理解

    ElasticSearch评分分析 explian 解释和一些查询理解 按照es-ik分析器安装了ik分词器.创建索引:PUT /index_ik_test.索引包含2个字段:content和nick ...

  10. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...