是编程乐趣,一个10年.Net开发经验老程序员,点击右上方“关注”,每天为你分享开源项目和编程知识。
推荐一个.Net开源库,用来解析和执行JavaScript代码。
01
项目简介
Jurassic是一个开源的托管JavaScript执行引擎,使用MS-PL授权协议。它的目标是成为.NET平台上功能最强,最为标准的JavaScript引擎。
02
项目特点
1、功能强大:支持ECMAScript 3和ECMAScript 5的功能,具备简单但强大的API,将JavaScript编译为.NET字节码(CIL),而非解释执行。这些功能使得Jurassic能够满足各种不同的编程需求;
2、适用场景多:可以作为.Net应用程序的一部分,适用于多种场景,比如:桌面应用、Web应用、游戏开发;
3、纯.Net开发:纯.Net开发,不依赖任何第三方库,可以完全集成到.Net框架中,可以在任何支持.Net平台执行;
4、高性能:使用轻量级代码生成技术,所有的动态代码均可被回收,使得具有高效的内存管理和高性能的运行速度;
5、集成Visual Studio调试功能:支持Visual Studio的调试功能,方便开发人员进行开发与调试。
03
使用示例
1、示例1:简单执行JavaScript代码
var engine=new Jurassic.ScriptEngine();
//输出11
Console.WriteLine(engine.Evaluate("var a=5; var b=6; a + b;"));
engine.Evaluate("function add(a,b){return a+b;}");
var result=engine.CallGlobalFunction<int>("add", 5, 6);
//输入11
Console.WriteLine(result);
2、示例2:C#中调用JavaScript函数
var engine=new Jurassic.ScriptEngine();
engine.SetGlobalFunction("test", new Func<int, int, int>((a, b)=> a + b));
var result=engine.Evaluate<int>("test(5, 6)");
//输出11
Console.WriteLine(result);
3、示例3:加载JavaScript文件
var engine=new Jurassic.ScriptEngine();
engine.ExecuteFile(@"utils.js");
var result=engine.CallGlobalFunction<int>("add", 5, 6);
//输出11
Console.WriteLine(result);
utils.js代码
function add(a, b) {
return a + b;
}
04
项目地址
https://github.com/paulbartrum/jurassic
我是编程乐趣,一个10年.Net开发经验老程序员,专注开源项目和编程知识分享。
私信回复:【888】,领取.Net视频教程。
- End -
推荐阅读
推荐一个.Ner Core开发的配置中心开源项目
一个C#开发的Windows远程桌面工具
一个基于.Net Core开发的适合外贸商城系统
基于 .NET Core MVC 的权限管理系统
基于Asp.Net Mvc开发的个人博客系统
项目简介
基于EF Core之Code First模式的NetCore快速开发框架。本脚手架支持代码自动生成,以快速开发.Net Core应用程序,实现前后端分离,支持开发多租户系统。极简至上,拒绝厚重。NET8版本努力让您有飞一般的体验!!!
!!!强烈建议通过CodeGen代码生成器初始化项目!!!
软件架构
Asp.net core 8.0+EF Core 8.0(Code First模式)
Newtonsoft.Json序列化
AutoMapper 映射
JWT+IdentityModel权限控制
Autofac依赖注入
Swagger+Swashbuckle.AspNetCore.ReDoc API文档
StackExchange.Redis/csredis
Quartz定时器
DotNetCore.NPOI:word/excel支持
NLog日志系统
hyjiacan.py4n 汉子转拼音
SkiaSharp 跨平台的2D 图像处理API操作
SkiaSharp.QrCode 二维码生成器,真正跨平台方案
Mustachio模板引擎代码生成器
Zack.EFCore.Batch?高性能批量操作库
System.Linq.Dynamic.Core?Linq动态查询库
其他:ChakraCore.NET JavaScript引擎
开发环境
VS2022
Net 8.0
Redis-5.0.14
SQL Server
MySQL 8.0以上
Sqlite
PostgreSQL
代码目录结构
Model:模型层
DAL:数据访问层
BLL:业务逻辑层
Web:控制器层
ImCore:基于Redis的即时聊天websocket核心
使用教程
新建项目文件夹,文件夹名字就是项目的名字。如:D:\project\CMS,其中CMS就是项目的名字。
将解压后的CodeGen.exe文件复制到CMS文件夹,并运行CodeGen.exe文件
第1步、输入"1",选择“NetCoreFast Api接口项目生成”
第2步、输入"1",选择“初始项目”。此过程会从码云下载NetCoreFast原始项目,并将项目名(解决方案名)改为项目文件夹的名字CMSApi.项目初始成功!
第3步、用vs打开CMSApi项目,并在Model层添加实体类,然后vs“重新生成”项目(注:添加了实体类一定要重新生成项目)
第4步、输入"2",选择“生成代码”,会自动生成bll、controller类
第5步、输入"3",选择“删除生成的代码”,会删除生成的bll、controller类【可选】
第6步、输入"4",选择“升级项目”,会自动从码云下载NetCoreFast最新代码更新项目,因而建议不要更改NetCoreFast框架代码,便于升级【可选】
第1步、输入"2",选择“Elementplus-admin-codegen后台前端管理界面项目生成”
第2步、输入"1",选择“初始项目”。此过程会从码云下载elementplus-admin-codegen原始项目,并将项目名改为项目文件夹的名字CMSUI.项目初始成功!
第3步、输入"4",选择“升级项目”,会自动从码云下载elementplus-admin-codegen最新代码更新项目,因而建议不要更改elementplus-admin-codegen代码,便于升级【可选】
快速开发
"ConnectionStrings": {
本文中,让我们尝试构建自定义 HTML Hepler以在 .NET Core MVC 应用程序中提供分页。首先对不熟悉的人简单介绍一下,什么是HTML Helper(助手):
在Web应用程序中,如果要显示大量记录,则需要提供分页。在本文中,我们通过创建自定义 HTML Helper 在 .NET Core MVC 应用程序中实现分页。为了简单起见,我们只能使用数字来表示数据。
假设我们需要在多页中显示 55 条记录,每页有 10 个项目,如上所示。
打开 Visual Studio 2019 > 创建 .NET Core MVC 应用程序,如下所示。
项目命名为 HTMLHelpersApp。
选择 .NET 框架版本。
创建所需的模型和帮助文件。
在 Number.cs 中添加代码。该模型捕获用户输入。它只有一个属性:“InputNumber”。
using System;
using System.ComponentModel.DataAnnotations;
namespace HTMLHelpersApp.Models
{
public class Number
{
//validation for required, only numbers, allowed range-1 to 500
[Required(ErrorMessage="Value is Required!. Please enter value between 1 and 500.")]
[RegularExpression(@"^\d+$", ErrorMessage="Only numbers are allowed. Please enter value between 1 and 500.")]
[Range(1, 500, ErrorMessage="Please enter value between 1 and 500.")]
public int InputNumber=1;
}
}
现在让我们添加一个公共类 PageInfo.cs。创建新文件夹 Common 并添加 PageInfo.cs 类。
在 PageInfo.cs 中添加代码:
根据总项目数和每页项目数,计算页面的总页数、第一个项目和最后一个项目。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace HTMLHelpersApp.Common
{
public class PageInfo
{
public int TotalItems { get; set; }
public int ItemsPerPage { get; set; }
public int CurrentPage { get; set; }
public PageInfo()
{
CurrentPage=1;
}
//starting item number in the page
public int PageStart
{
get { return ((CurrentPage - 1) * ItemsPerPage + 1); }
}
//last item number in the page
public int PageEnd
{
get
{
int currentTotal=(CurrentPage - 1) * ItemsPerPage + ItemsPerPage;
return (currentTotal < TotalItems ? currentTotal : TotalItems);
}
}
public int LastPage
{
get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); }
}
}
}
现在我们来到最重要的部分:创建自定义 HTML 助手。
public static IHtmlContent PageLinks(this IHtmlHelper htmlHelper, PageInfo pageInfo, Func<int, string> PageUrl)
5.取2个参数
使用标签构建器创建锚标签。
TagBuilder tag=new TagBuilder("a");
Add attributes
tag.MergeAttribute("href", hrefValue);
tag.InnerHtml.Append(" "+ innerHtml + " ");
样式也可以用作属性。
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Text;
namespace HTMLHelpersApp.Common
{
public static class PagingHtmlHelpers
{
public static IHtmlContent PageLinks(this IHtmlHelper htmlHelper, PageInfo pageInfo, Func<int, string> PageUrl)
{
StringBuilder pagingTags=new StringBuilder();
//Prev Page
if (pageInfo.CurrentPage > 1)
{
pagingTags.Append(GetTagString("Prev", PageUrl(pageInfo.CurrentPage - 1)));
}
//Page Numbers
for (int i=1; i <=pageInfo.LastPage; i++)
{
pagingTags.Append(GetTagString(i.ToString(), PageUrl(i)));
}
//Next Page
if (pageInfo.CurrentPage < pageInfo.LastPage)
{
pagingTags.Append(GetTagString("Next", PageUrl(pageInfo.CurrentPage + 1)));
}
//paging tags
return new HtmlString(pagingTags.ToString());
}
private static string GetTagString(string innerHtml, string hrefValue)
{
TagBuilder tag=new TagBuilder("a"); // Construct an <a> tag
tag.MergeAttribute("class","anchorstyle");
tag.MergeAttribute("href", hrefValue);
tag.InnerHtml.Append(" "+ innerHtml + " ");
using (var sw=new System.IO.StringWriter())
{
tag.WriteTo(sw, System.Text.Encodings.Web.HtmlEncoder.Default);
return sw.ToString();
}
}
}
}
在“Models”文件夹中添加一个新类“ShowPaging.cs”。
using HTMLHelpersApp.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace HTMLHelpersApp.Models
{
public class ShowPaging
{
//validation for required, only numbers, allowed range-1 to 500
[Required(ErrorMessage="Value is Required!. Please enter value between 1 and 500.")]
[RegularExpression(@"^\d+$", ErrorMessage="Only positive numbers are allowed. Please enter value between 1 and 500.")]
[Range(1, 500, ErrorMessage="Please enter value between 1 and 500.")]
public int InputNumber { get; set; }
public List<string> DisplayResult { get; set; }
public PageInfo PageInfo;
}
}
添加一个新控制器:“HTMLHelperController”
右键单击控制器文件夹并在上下文菜单中选择控制器。
选择“MVCController-Empty”。
在“HTMLHelperController”中添加代码。
using HTMLHelpersApp.Common;
using HTMLHelpersApp.Models;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace HTMLHelpersApp.Controllers
{
public class HTMLHelperController : Controller
{
private const int PAGE_SIZE=10;
public IActionResult Number()
{
return View();
}
public IActionResult ShowPaging(ShowPaging model, int page=1, int inputNumber=1)
{
if (ModelState.IsValid)
{
var displayResult=new List<string>();
string message;
//set model.pageinfo
model.PageInfo=new PageInfo();
model.PageInfo.CurrentPage=page;
model.PageInfo.ItemsPerPage=PAGE_SIZE;
model.PageInfo.TotalItems=inputNumber;
//Set model.displayresult - numbers list
for (int count=model.PageInfo.PageStart; count <=model.PageInfo.PageEnd; count++)
{
message=count.ToString();
displayResult.Add(message.Trim());
}
model.DisplayResult=displayResult;
}
//return view model
return View(model);
}
}
}
在 Views 文件夹中创建一个新文件夹“HTMLHelper”,并创建一个新视图“Number.cshtml”。
在“Number.cshtml”中添加代码。
@model HTMLHelpersApp.Models.Number
<h4>Number</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="ShowPaging" method="get">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<input asp-for="InputNumber" class="form-control"/>
</div>
<div class="form-group">
<input type="submit" value="Submit" class="btn btn-primary" />
</div>
</form>
</div>
</div>
同样,创建一个新视图“ShowPaging.cshtml”。
@model HTMLHelpersApp.Models.ShowPaging
@using HTMLHelpersApp.Common
<link rel="stylesheet" href="~/css/anchorstyles.css"/>
<form>
<h4>Show Paging</h4>
<hr />
<div asp-validation-summary="All" class="text-danger"></div>
<dl class="row">
<dt class="col-sm-2">
<b>Number: </b> @Html.DisplayFor(model=> model.InputNumber)
</dt>
<dd>
<a asp-action="Number">Change Number</a>
</dd>
</dl>
<div>
@if (Model !=null && Model.DisplayResult !=null)
{
<ul>
@foreach (var item in Model.DisplayResult)
{
<li>@Html.Raw(item)</li>
}
</ul>
<div>
@Html.PageLinks(@Model.PageInfo, x=> Url.Action("ShowPaging",
new { page=x.ToString(), inputNumber=@Model.InputNumber }))
</div>
}
</div>
</form>
解决方案资源管理器如下所示:
在“startup.cs”中配置默认控制器和操作。
编译并运行应用程序,输入数字 35。
点击提交。
你会在底部看到分页,每页显示10个数字,一共4页,且每页都一个链接。
*请认真填写需求信息,我们会在24小时内与您取得联系。