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有关,有的 ...
随机推荐
- mysq-5.7忘记密码修改
一,停止mysql /etc/init.d/mysqld stop 二,启动mysql mysqld_safe --skip-grant-tables 安全模式+免验证启动服务 三,登入mysql服务 ...
- jmeter和ab的对比
压测比较常用的工具:ab,webbench,jmeter ab和webbench作为shell模式下轻量级的测试工具,ab比webbench功能更多一些 jmeter作为有GUI界面的更高级测试工具 ...
- 在Mu-kittenbot中使用Robotbit固件
首先,先下载安装支持robotbit扩展板的Mu: http://cdn.kittenbot.cn/mu/mu-kittenbot.exe 标准的3针插口,信号,正电,负电,可接市面的arduino模 ...
- Flink之state processor api原理
无论您是在生产环境中运行Apache Flink or还是在过去将Flink评估为计算框架,您都可能会问自己一个问题:如何在Flink保存点中访问,写入或更新状态?不再询问!Apache Flink ...
- 【MySQL】Mariadb字符集
Mariadb字符集 如果不设置字符集,可以查看mariadb的字符集的默认设置是latin1. 如下命令,查看Mariadb的默认配置: [root@oradb ~]# /usr/local/mys ...
- Charles设置断点- (超详解)
1.选择你要设置断点的接口 2.右键选择 Breakpoints 3.断点的相关配置, Proxy ——>Breakpoint Settings 5.双击刚刚已经设置的断点接口,进行设置 6. ...
- 前端图片canvas,file,blob,DataURL等格式转换
将file转化成base64 方法一:利用URL.createObjectURL() <!DOCTYPE html> <html> <head> <title ...
- APUE—UNIX文件系统
在linux系统中——一切都是文件. 1. 磁盘物理结构 磁盘的物理结构如下: 磁盘由很多盘面组成,而盘面上则是由很多同心圆环组成的磁道,每个磁道又被切割成许多扇区.所有磁盘面的同一个磁道构成一个柱面 ...
- html 图片滚动代码
我自己也在用的,网页常用!分享出来 最简单易懂源码 <!--下面是向上滚动代码--> <div id=butong_net_top style=overflow:hidden;hei ...
- Linux纯小白操作(以安装JDK为例)
[本文只针对纯小白,有基础的请略过] 最近公司给分配工作使用的虚拟机都是Linux系统的,以前完全没接触过,今天按照网上一些教程操作,好多地方感觉对小白不够友好(有些问题非常小白那些教程没有写出来.我 ...