未完待续...

案例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. [Powershell]导出指定的定时计划任务

    <# .NOTES =========================================================================== Created wit ...

  2. Python【每日一问】38

    问: 基础题: 设计一个经营杠杆系数函数DOL,它包含三个参数,S为营业收入,C为变动成本总额,F为固定成本的总额. 已知2018年的S为20,C为11,F为3,求2019年的经营杠杆系数. 提高题: ...

  3. linux centos安装教程

    linux centos安装教程1 CentOS-7-x86_64-DVD-1511.iso 这个是dvd版本 2 CentOS-7-x86_64-Minimal-1511.iso 这个迷你版 是没有 ...

  4. Linux启动/停止/重启gitlab

    # Start all GitLab components sudo gitlab-ctl start # Stop all GitLab components sudo gitlab-ctl sto ...

  5. ASP.NET MVC+Easyui 后台管理系统的图片上传

    实现图片的上传 easyui代码部分: //添加按钮 var URL; $("#btnCreate").click(function () { $('#UserDialog').d ...

  6. 制作一个SSRS的ORACLE数据库报表,使用了时间类型的参数。

    需求:我们这个报表是以月为单位,呈现的数据为查询为当前月的第一天到最后一天.条件类似于:time_day > 20140601 and  time_day < 20140630 因为是让用 ...

  7. 关于django模型里面的__str__和__unicode__

    python3    django模型里面 使用 __str__  如果使用__unicode__是无效的 简而言之,就是__str__和__unicode__都是为了再管理站点中加载这个表时想显示什 ...

  8. 微服务架构 ------ 插曲 hikari连接池的配置

    开胃菜:据说hikari连接池很快,快到让另一个连接池的作者抛弃对自己连接池的维护,并且强烈推荐使用hikari 连接池目前我们项目使用的有两个 一个是Druid , 一个是 Hikari, 其中Dr ...

  9. js中的原型,原型链和继承

    在传统的基于Class的语言如Java.C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass. 由于这类语言严格区分类和实例,继承实际上是类型的扩展.但是,JavaScript最 ...

  10. WPE 过滤器 高级滤镜

    与普通滤镜区别就是: 普通滤镜固定位置 高级滤镜固定数值 普通滤镜 指定位置1~6,对应发送数据的固定1~6字节 高级滤镜 首先,勾选高级-自发现有连锁位置 记得,偏移001对应修改000位置,也可称 ...