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有关,有的 ...
随机推荐
- 【网络知识之三】HTTPS协议
HTTPS是身披SSL外壳的HTTP.HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包.HTTPS使用的主要目的是提供对网站服务器的 ...
- CSS3幸运大转盘最简单的写法
点击开始 直接css动画 如果你要自己控制转到哪里 那就多写几个class 根据不同角度 运行不同的class..<pre>.zhuandong{ animation: zhuandong ...
- centos下java环境搭建安装
1. 购买服务器(阿里云) 2. 重置密码,重启服务器 3. 创建账号work groupadd work #创建组 mkdir /data # 创建数据文件夹 useradd -d /data/wo ...
- jetbrain 公司2019年全套产品的破解方案
百度网盘下载地址是:链接:https://pan.baidu.com/s/1E4E76Oglfexed0iHNiXjEQ 密码:pehx ======================== ...
- 【02】Python:数据类型和运算符
写在前面的话 任何编程语言一开始都是从概念出发的,但各种编程语言之间的概念可能又会有差异,所以,老生常谈,我们还是需要从新过一遍 Python 的概念,当然,如果你已经是老司机了,完全可以一晃而过,不 ...
- Jmeter使用笔记1
1.简介 jmeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台.多数情况下是用作压力测试,该测试工具在阿里巴巴有着广泛的使用. 2.安装 下载apache-jmeter-3.1.rar; ...
- Java8 Lamda的基本使用
Lamda的基本使用 https://www.cnblogs.com/htyj/p/10133883.html https://segmentfault.com/q/1010000011200292 ...
- 13、VUE单文件工程
1.为什么要使用单文件工程? 1.Vue.js路由组件的不方便 不支持引用HTML页面,以至于template里面定义的标签会编辑器当字符串,这让编辑变的困难. 2.Vue.js于Node.js语言结 ...
- vue 强制刷新 demo 神器
this.$forceUpdate() /*关键句,强制更新dom*/
- python类的构造函数
最新的 Python3.7 中(2018.07.13),对类的构造函数进行了精简. from dataclasses import dataclass @dataclass class A: x:in ...