未完待续...

案例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扩展几个插件的更多相关文章

  1. ASP.NET MVC Core的TagHelper (高级特性)

    这篇博文ASP.NET MVC Core的TagHelper(基础篇)介绍了TagHelper的基本概念和创建自定义TagHelper的方式,接着继续介绍一些新的看起来比较高级的特性.(示例代码紧接着 ...

  2. ASP.NET MVC Core的TagHelper(基础篇)

    TagHelper又是一个新的名词,它替代了自之前MVC版本的HtmlHelper,专注于在cshmlt中辅助生成html标记. 通过使用自定义的TagHelper可以提供自定义的Html属性或元素, ...

  3. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  4. .NET CORE的TagHelper智能提示

    VisualStudio2017下ASP.NET CORE的TagHelper智能提示不能使用的解决办法   之前在VS2017RC中就发现该问题,安装了依赖,但是前段一直点不出来asp-for,后来 ...

  5. 【新特性速递】FineUIPro/Mvc/Core 全新移动端访问体验(示例首页)!

    移动端支持 虽然 FineUIPro 早在 2016 年就已经完成对移动端的适配工作,并新增了 50 多个官网示例. 并且,我们也新增了一个移动端的首页 http://pro.fineui.com/m ...

  6. .NET CORE学习笔记系列(1)——ASP.NET MVC Core 介绍和项目解读

    ASP.NET MVC Core 项目文件夹解读 一.项目文件夹总览 1.1.Properties——launchSettings.json 启动配置文件,你可以在项目中“Properties”文件夹 ...

  7. 使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载

    一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.NET 运行时无法回收它们,如果我们要实现插件热加载 (例如 Razor 或 Aspx 模版的热 ...

  8. MVC Core 网站开发(Ninesky) 1、创建项目

    又要开一个新项目了!说来惭愧,以前的东西每次都没写完,不是不想写完,主要是我每次看到新技术出来我都想尝试一下,看到.Net Core 手又痒了,开始学MVC Core. MVC Core最吸引我的有三 ...

  9. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

随机推荐

  1. 工作中常用的Linux命令介绍与实践

    前言 做后端开发的同学,一般都会接触到服务器,而我们现在的系统用的比较多的服务器系统就是linux了,平时多多少少也会接触到一些linux下的shell命令.我们来介绍下linux一些常用的命令和使用 ...

  2. DataSet 反射转换成 List<T>

    /// <summary> /// DataSet转换成指定返回类型的实体集合 /// </summary> /// <typeparam name="T&qu ...

  3. MySQL binlog三种模式

    1.1 Row Level  行模式 日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改 优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文 ...

  4. 动手学深度学习8-softmax分类pytorch简洁实现

    定义和初始化模型 softamx和交叉熵损失函数 定义优化算法 训练模型 import torch from torch import nn from torch.nn import init imp ...

  5. 2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧!

    2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧! http://blog.zh66.club/index.php/archives/116/

  6. 建模语言UML

    建模语言UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持, ...

  7. SpringBoot系列之profles配置多环境(篇一)

    SpringBoot profles配置多环境 23/100 发布文章 u014427391 软件环境简介 这里介绍一下SpringBoot提供的profiles属性加上maven配置一下多环境,在实 ...

  8. Ansible17:Playbook之tags

    目录 简介 为task打tag 使用tag 执行指定tag的task 排除指定tag的task 查看playbook中的所有tag 打tag的几种方式 ansible内置tag 简介 在大型项目当中, ...

  9. 使用Ueditor上传图片到图片服务器(二)

    上一篇主要写了前端部分如何配置ueditor的上传路径,已经jsp页面中如何使用ueditor的编辑器功能以及如何配置单独的图片上传功能. 这一篇,我分两部分:第一部分是搭建图片服务器以及配置ftp上 ...

  10. VS.NET(C#)--2.4_aspx默认页面模板代码

    默认模板代码 客户端浏览器将忽视<script>块间任何字符,不在页面输出.通过<%=DataTime.Now.ToString() %>      将服务端代码放中间 < ...