首页 > 编程语言 >Asp.net core使用Razor试图引擎编写TagHelper

Asp.net core使用Razor试图引擎编写TagHelper

时间:2023-06-27 20:13:37浏览次数:60  
标签:core Asp Razor get Id var using Model public

之前使用wtm来进行快速开发

wtm框架见:

https://wtmdoc.walkingtec.cn/

其前端选择Layui的情况下有大量的TagHelper,大幅度提高了开发效率

 虽然已有的组件很丰富但也不能完全覆盖所有的需求,这个时候就需要自己写TagHelper。

参考了WTM源码,和微软官方文档

TagHelper虽然使用起来方便,但是大量的拼接字符串编写体验和可读性都不是很好。

理想的情况是能充分利用.net中强大的Razor引擎来编写TagHelper,从而更方便的进行组件复用。

可以从asp.net core中找到viewengine的使用方法

 

 以封装一个wangEditor为例

TagHelper:

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.IO;
using WalkingTec.Mvvm.Core;
using WalkingTec.Mvvm.Core.Extensions;
using WalkingTec.Mvvm.TagHelpers.LayUI;


namespace TagHelpers
{
    [HtmlTargetElement("wt:wangeditor", Attributes = "field", TagStructure = TagStructure.WithoutEndTag)]
    public class WangEditorTagHelper : TagHelper
    {
        public WangEditorTagHelper(ICompositeViewEngine viewEngine,IHttpContextAccessor httpContextAccessor) 
        {
            _viewEngine = viewEngine;
            _httpContextAccessor = httpContextAccessor;
        }

        public ModelExpression Field { get; set; }
        public string Id { get; set; }

        public string Name { get; set; }

        public int Height { get; set; } = 300;


        private ICompositeViewEngine _viewEngine;
        private IHttpContextAccessor _httpContextAccessor;

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            var viewEngineResult = _viewEngine.GetView("~/Views/Shared/Components/WangEditor/", "Default.cshtml", false);
            if (!viewEngineResult.Success)
            {
                throw new InvalidOperationException($"Couldn't find view /Shared/Components/WangEditor/Default.cshtml");
            }

            using (var sr = new StringWriter())
            {
                var viewContext = new ViewContext();
                viewContext.HttpContext = _httpContextAccessor.HttpContext;
                viewContext.ViewData = new ViewDataDictionary<WangEditorConfig>(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                {
                    Model = new WangEditorConfig()
                    {
                        Id = Id ?? Utils.GetIdByName(Field?.ModelExplorer.Container.ModelType.Name + "." + Field?.Name),
                        Name = Name ?? Field?.Name,
                        Value = Field?.Model?.ToString(),
                        Height = Height
                    }
                };
                viewContext.Writer = sr;

                viewEngineResult.View.RenderAsync(viewContext).GetAwaiter().GetResult();
                output.TagName = "div";
                output.TagMode = TagMode.StartTagAndEndTag;
                output.Content.SetHtmlContent(sr.ToString());
            }
        }
    }

    public class WangEditorConfig
    {
        public string Id { get; set; }

        public string Name { get; set; }

        public string Value { get; set; }

        public int Height { get; set; }
    }
}

 

cshtml,使用razor视图引擎编写可读性就好了很多。

@using TagHelpers;
@model WangEditorConfig

<style>
    #@(Model.Id)-editor—wrapper {
          border: 1px solid #ccc;
    }

    #@(Model.Id)-toolbar-container {
        border-bottom: 1px solid #ccc;
    }

    #@(Model.Id)-editor-container {
        height: @(Model.Height)px;
    }
</style>

<div id="@(Model.Id)-editor—wrapper" class="layui-input-block">
    <div id="@(Model.Id)-toolbar-container"><!-- 工具栏 --></div>
    <div id="@(Model.Id)-editor-container"><!-- 编辑器 --></div>
    <input type="hidden" value="@Model.Value" name="@Model.Name" id="@(Model.Id)-hidden"/>
</div>

<script type="text/javascript">
    (function(){
        var wEditor = window.wangEditor;

        var editorConfig = {
            placeholder: '请输入...',
            onChange(editor) {
                var hidden = document.getElementById("@(Model.Id)-hidden");
                var html = editor.getHtml();
                hidden.value=html;
            }
        }

        var editor = wEditor.createEditor({
            selector: '#@(Model.Id)-editor-container',
            html: '@Html.Raw(Model.Value)',
            config: editorConfig,
            mode: 'default', // or 'simple'
        })

        var toolbarConfig = {}

        toolbarConfig.excludeKeys = [
            'insertVideo', 'insertImage'
        ];

        var toolbar = wEditor.createToolbar({
            editor,
            selector: '#@(Model.Id)-toolbar-container',
            config: toolbarConfig,
            mode: 'simple', // or 'simple'
        })

        
        console.log(toolbar.getConfig().toolbarKeys);
    }());
   
</script>

 

标签:core,Asp,Razor,get,Id,var,using,Model,public
From: https://www.cnblogs.com/hejiajun/p/17459801.html

相关文章

  • .NET Core 获取小程序手机号并解析
    方法一:1.小程序提供微信用户授权后的code,用户手机号的加密数据和iv。2.使用code换取 sessionkey。3. 解密用户手机号的加密数据。参考代码///<summary>///获取openid,sessionkey///</summary>///<paramname="appID"></param......
  • .NET Core WEB API中参数的模型绑定方式
    .NETCoreWEBAPI中参数的模型绑定方式有以下几种:参考文献:.NETCoreWEBAPI中接口参数的模型绑定的理解-枫叶456-博客园(cnblogs.com)微软官方说明文档 FromForm:当请求属于表单提交,也就是content-type为application/x-www-form-urlencoded,则必须给参数加上From......
  • 将 SmartAssembly 与单文件可执行文件一起使用 (.NET Core 6)
    .NETCore6引入了创建单文件可执行文件的功能。这只允许分发一个应用程序文件,因为所有配置和依赖项都包含在二进制文件本身中。该功能为依赖项嵌入提供了一种本机方法,这在发布生成数百个程序集的独立应用程序时最有益。它可用于依赖于框架或自包含的应用程序,但在这两种情况下都......
  • Taurus .Net Core 微服务开源框架:Admin 插件【2】 - 系统环境信息管理
    前言:继上篇:Taurus.NetCore微服务开源框架:Admin插件【1】-微服务节点管理本篇继续介绍下一个内容:1、系统环境信息节点- OS-Environment界面 基本信息如上图,重点的几个参数:1、App-StartTime:应用程序启用时间,可以在更新程序或配置文件后,查看该时间,看应用程序是否更......
  • Typora PicGo-Core gitee
    参考:(41条消息)Typora+PicGo-core插入图片自动上传,gitee,gitgub,sm.ms三种免费图床_jaymier的博客-CSDN博客(41条消息)Node.js下载安装及环境配置教程【超详细】_nodejs下载安装教程_WHF__的博客-CSDN博客1、安装Node.js下载|Node.js中文网(nodejs.cn)傻瓜式,直接下一步,可......
  • 基于前端Vue后端.NetCore Web后台管理系统通用开本框架采用前后端分离技术
    基于前端Vue后端.NetCoreWeb后台管理系统通用开本框架采用前后端分离技术,前端使用vue2.6.0,后端使用.netcore3.1,支持跨平台、多租户、支持MySQLSQLServerOracle多数据库,模块化设计,高性能,高颜值,不管是个人学习还是企业做项目都非常适合 原创文章,转载请说明出处,资料来源:http://im......
  • .net core使用channel消息队列
    .netcore使用channel消息队列背景最近做一个项目,连接了很多设备,需要保存设备的心跳数据,刚开始的做法是直接接收到设备的数据之后进行心跳数据的保存,但是随着设备多了起来,然后设备的使用时长不断的加大,对数据库的压力也比较大,所以想着优化一下。方案调研1.使用第三方中间件常......
  • .NETCore项目在Windows下构建Docker镜像并本地导出分发到CentOS系统下
    在Windows下使用Docker,我们选择DockerDesktop这个软件,非常方便。DockerDesktop介绍及安装DockerDesktop是适用于Mac、Linux或Windows环境的一键安装应用程序,使您能够构建和共享容器化应用程序和微服务。它提供了一个简单的GUI(图形用户界面),允许您直接从机器管理容器、应用程......
  • SQLServer Core 序列号使用CPU限制的处理
    SQLServerCore序列号使用CPU限制的处理背景有客户是SQLSERVER的数据库.说要进行一下压测.这边趁着最后进行一下环境的基础搭建工作.然后在全闪的环境上面搭建了一个Windows2019+SQL2019的环境发现一个挺好的地方.SQLSERVER会提示,如果使用enterprise的序列号的话仅能......
  • 编译 CoreML 模型
    本篇文章译自英文文档CompileCoreMLModels作者是JoshuaZ.Zhang,KazutakaMorita,ZhaoWu更多TVM中文文档可访问→ApacheTVM是一个端到端的深度学习编译框架,适用于CPU、GPU和各种机器学习加速芯片。|ApacheTVM中文站本文介绍如何用Relay部署CoreML模型。首先......