MVC Core 使用TagHelper扩展几个插件
未完待续...
案例1:按钮权限校验,无权限不显示,利用TagHelper控制元素是否输出
[HtmlTargetElement("tc-permission", TagStructure = TagStructure.NormalOrSelfClosing)]
public class TCPermissionTagHelper : TagHelper
{
private IPermissionContext permissionContext = null;
public TCPermissionTagHelper(IPermissionContext permissionContext)
{
this.permissionContext = permissionContext;
}
public string[] Permissions { get; set; }
public string Permission { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (output == null)
{
throw new ArgumentNullException(nameof(output));
}
output.TagName = null;
if (!string.IsNullOrEmpty(Permission))
{
Permissions = Permission.SplitToArray<string>();
}
//HasPermission:根据UserID、按钮权限编码判断用户是否有此按钮权限,如果无权就不输出
if (Permissions == null || Permissions.Length == || !permissionContext.HasPermission(Permissions))
{
output.SuppressOutput();
return;
}
}
}
页面中添加:
<tc-permission permission="@Permissions.系统模块.账户管理.添加">
<a id="btnAdd" class="btn btn-primary" onclick="cache.add(); return false;">添加</a>
</tc-permission>
lable-input插件:
[HtmlTargetElement("label-input")]
public class FieldTagHelper : TagHelper
{
public string FieldName { get; set; }
public string Label { get; set; }
public string Value { get; set; }
public string PlaceHolder { get; set; }
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.Attributes.Add("class", "form-group");
output.Content.SetHtmlContent(
$@"<label for='{FieldName}'>{Label}</label>
<input type='text' id='{FieldName}' name='{FieldName}' value='{Value}'>");
return base.ProcessAsync(context, output);
}
}
Enum版Select:
/// <summary>
/// Enum版Select
/// </summary>
[HtmlTargetElement("select-enum")]
public class SelectEnumTagHelper : TagHelper
{
public Type EnumType { get; set; }
public object Value { get; set; }
public string Placeholder { get; set; }
//public Dictionary<string, object> Attributes { get; set; }
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "select";
StringBuilder buffer = new StringBuilder();
if (!string.IsNullOrWhiteSpace(this.Placeholder))
{
buffer.Append($"<option value='0'>{this.Placeholder}</option>");
}
string selected = string.Empty;
if (EnumType != null && EnumType.IsEnum)
{
var enumFields = Enum.GetValues(EnumType);
foreach (var enumField in enumFields)
{
selected = (int)Value == (int)enumField ? "selected='selected'" : "";
buffer.Append($"<option value='{(int)enumField}' {selected}>{enumField.ToString()}</option>");
}
}
output.Content.SetHtmlContent(buffer.ToString()); return base.ProcessAsync(context, output);
}
}
Source版select:
/// <summary>
/// Source版Select
/// </summary>
[HtmlTargetElement("select-source")]
public class SelectSourceTagHelper : TagHelper
{
public string ValueFieldName { get; set; }
public string TextFieldName { get; set; } public IEnumerable<object> Source { get; set; }
public object Value { get; set; }
public string Placeholder { get; set; }
//public Dictionary<string, object> Attributes { get; set; }
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "select";
StringBuilder buffer = new StringBuilder();
if (!string.IsNullOrWhiteSpace(this.Placeholder))
{
buffer.Append($"<option value='0'>{this.Placeholder}</option>");
}
string selected = string.Empty;
if (this.Source != null && this.Source.Count() > )
{
Type sourceType = Source.FirstOrDefault().GetType();
var tProperty = sourceType.GetProperty(this.TextFieldName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase);
var vProperty = sourceType.GetProperty(this.ValueFieldName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase);
if (tProperty != null && vProperty != null)
{
object text = null;
object value = null;
foreach (var item in Source)
{
text = tProperty.GetValue(item, null);
value = vProperty.GetValue(item, null); selected = (int)this.Value == (int)value ? "selected='selected'" : "";
buffer.Append($"<option value='{(int)value}' {selected}>{text}</option>");
}
output.Content.SetHtmlContent(buffer.ToString());
}
} return base.ProcessAsync(context, output);
}
}
@using MVCCoreDemo
@addTagHelper *,MVCCoreDemo
@{
List<Person> personList = new List<Person> {
new Person{ ID=,Name="zhao"},
new Person{ ID=,Name="qian"},
new Person{ ID=,Name="sun"},
new Person{ ID=,Name="li"}
}; } <label-input field-name="UserName" label="用户名:" placeholder="请输入用户名" value="zhangsan"></label-input>
<select-enum id="select1" name="select1" class="c1" enum-type="@typeof(ECustomerLevel)" Value="" placeholder="请选择"></select-enum>
<select-source id="select2" name="select2" class="c1" source="@personList" Value="" value-field-name="ID" text-field-name="Name" placeholder="请选择"></select-source>
MVC Core 使用TagHelper扩展几个插件的更多相关文章
- ASP.NET MVC Core的TagHelper (高级特性)
这篇博文ASP.NET MVC Core的TagHelper(基础篇)介绍了TagHelper的基本概念和创建自定义TagHelper的方式,接着继续介绍一些新的看起来比较高级的特性.(示例代码紧接着 ...
- ASP.NET MVC Core的TagHelper(基础篇)
TagHelper又是一个新的名词,它替代了自之前MVC版本的HtmlHelper,专注于在cshmlt中辅助生成html标记. 通过使用自定义的TagHelper可以提供自定义的Html属性或元素, ...
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
- .NET CORE的TagHelper智能提示
VisualStudio2017下ASP.NET CORE的TagHelper智能提示不能使用的解决办法 之前在VS2017RC中就发现该问题,安装了依赖,但是前段一直点不出来asp-for,后来 ...
- 【新特性速递】FineUIPro/Mvc/Core 全新移动端访问体验(示例首页)!
移动端支持 虽然 FineUIPro 早在 2016 年就已经完成对移动端的适配工作,并新增了 50 多个官网示例. 并且,我们也新增了一个移动端的首页 http://pro.fineui.com/m ...
- .NET CORE学习笔记系列(1)——ASP.NET MVC Core 介绍和项目解读
ASP.NET MVC Core 项目文件夹解读 一.项目文件夹总览 1.1.Properties——launchSettings.json 启动配置文件,你可以在项目中“Properties”文件夹 ...
- 使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载
一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.NET 运行时无法回收它们,如果我们要实现插件热加载 (例如 Razor 或 Aspx 模版的热 ...
- MVC Core 网站开发(Ninesky) 1、创建项目
又要开一个新项目了!说来惭愧,以前的东西每次都没写完,不是不想写完,主要是我每次看到新技术出来我都想尝试一下,看到.Net Core 手又痒了,开始学MVC Core. MVC Core最吸引我的有三 ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
随机推荐
- Leetcode 第135场周赛解题报告
这周比赛的题目很有特点.几道题都需要找到一定的技巧才能巧妙解决,和以往靠数据结构的题目不太一样. 就是如果懂原理,代码会很简单,如果暴力做,也能做出来,但是十分容易出错. 第四题还挺难想的,想了好久才 ...
- tmp/ccdLyHub.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status
其实就是一个问题,gcc只能编译.c文件,你如果取名为.cpp,那么gcc编译就会就会出现这个错误. 这种情况下: 1.用g++编译(.c 或.c++都可以编译) 2.仍用gcc编译,但是文件后缀改为 ...
- Redux + React-router 的入门和配置教程
(转载)原文链接: https://juejin.im/post/5dcaaa276fb9a04a965e2c9b#heading-18 前言
- Android ADB 实用总结
一.背景 从系统架构上来说,Android是基于Linux系统基础上,做了进一步的定制与修改,并融入了自身的特有功能,且向应用层提供应用程序接口,供开发者使用.系统内核层面,主体依然是Linux内核. ...
- 以Integer类型传参值不变来理解Java值传参
最近在写代码的时候出了一个错误,由于对值引用理解的不深,将Integer传入方法中修改,以为传入后直接修改Integer中的值就不用写返回值接收了,虽然很快发现了问题,但还是来总结一下 首先是代码: ...
- 2019年12月的第一个bug
现在是2019年12月1日0点27分,我的心情依旧难以平静.这个月是2019年的最后一个月,是21世纪10年代的最后一个月,也是第一批90后30岁以前的最后一个月.就是在这个月的第一天的0点0分,我写 ...
- 【CTS2019】珍珠(生成函数)
[CTS2019]珍珠(生成函数) 题面 LOJ 洛谷 题解 lun题可海星. 首先一个大暴力\(sb\)的\(dp\)是设\(f[i][S]\)表示当前考虑完了前\(i\)个珍珠,\(S\)集合中这 ...
- 【华为云实战开发】8.如何快速搭建C#网站并实现持续集成?【华为云技术分享】
1 概述 1.1 文章目的 本文通过一个实例介绍如何使用软件开发服务DevCloud完成一个C#Web项目的开发. 1.2 项目详情 1. 项目名称:超级冷笑话网站 2. 项目简介:一个Web网站,包 ...
- Java设计模式原型模式
原型模式: – 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式. – 就是java中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具备原型对象的特点 – 优势 ...
- jquery validate 动态生成的多个同名input的验证
我的应用场景是,添加和修改入库单的明细,明细是以表格的形式呈现,可以动态添加商品,用jquery.validate插件做数据验证. 由于jquery.validate插件验证同名的input时只验证第 ...