Home  >  Article  >  Backend Development  >  Detailed example of asp.net core encapsulating layui component

Detailed example of asp.net core encapsulating layui component

黄舟
黄舟Original
2017-10-11 10:23:523577browse

This article mainly introduces the detailed explanation of the asp.net core encapsulated layui component example sharing. The editor thinks it is quite good. Now I will share it with you and give you a reference. Let’s follow the editor and take a look.

What package should I use? TagHelper is just used here, what is it? Read the documentation yourself

When learning to use TagHelper, what I hope most is to have a Demo that I can use as a reference

  • How to encapsulate a component?

  • How to implement different situations?

  • Is there a better and more efficient way?

I searched and searched, and finally ran to look at TagHelpers in mvc, and then took a good look at TagHelper’s documentation

I barely struggled for a while After each component came out, I originally wanted to write an article one by one, but I found that the National Day is over~

Demo download

Effect preview

##The code is for reference only, please feel free to enlighten me if you have different opinions

Checkbox checkbox component package

Tag name: cl-checkbox


Tag attributes: asp-for: The bound field must be specified

    ##asp-items: The binding single option type is: IEnumerable90fc9151e669273219504e6e41f84252
  1. asp-skin: Layui skin style, default or original
  2. asp-title: If it is just a check box, the text displayed, and Items are not specified, and the default Checkbox value is true

When looking at the source code during encapsulation, I found two very useful pieces of code


1. Determine whether multiple selections are possible:


Copy code

The code is as follows:

var realModelType = For.ModelExplorer.ModelType; //通过类型判断是否为多选 
var _allowMultiple = typeof(string) != realModelType && typeof(IEnumerable).IsAssignableFrom(realModelType);
2. Get the list value of model binding ( Multiple selection)


Copy code

The code is as follows:

var currentValues = Generator.GetCurrentValues(ViewContext,For.ModelExplorer,expression: For.Name,allowMultiple: true);
These three lines of code were found in the SelectTagHelper that comes with mvc.


Because core has actually provided a lot of TagHelpers. For example, the commonly used select is a good reference object. When you encounter problems with the encapsulation, you may find unexpected results if you look for them.

CheckboxTagHelper code


using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;

namespace LayuiTagHelper.TagHelpers
{
 /// <summary>
 /// 复选框
 /// </summary>
 /// <remarks>
 /// 当Items为空时显示单个,且选择后值为true
 /// </remarks>
 [HtmlTargetElement(CheckboxTagName)]
 public class CheckboxTagHelper : TagHelper
 {
  private const string CheckboxTagName = "cl-checkbox";
  private const string ForAttributeName = "asp-for";
  private const string ItemsAttributeName = "asp-items";
  private const string SkinAttributeName = "asp-skin";
  private const string SignleTitleAttributeName = "asp-title";
  protected IHtmlGenerator Generator { get; }
  public CheckboxTagHelper(IHtmlGenerator generator)
  {
   Generator = generator;
  }

  [ViewContext]
  public ViewContext ViewContext { get; set; }

  [HtmlAttributeName(ForAttributeName)]
  public ModelExpression For { get; set; }

  [HtmlAttributeName(ItemsAttributeName)]
  public IEnumerable<SelectListItem> Items { get; set; }

  [HtmlAttributeName(SkinAttributeName)]
  public CheckboxSkin Skin { get; set; } = CheckboxSkin.默认;

  [HtmlAttributeName(SignleTitleAttributeName)]
  public string SignleTitle { get; set; }

  public override void Process(TagHelperContext context, TagHelperOutput output)
  {
   //获取绑定的生成的Name属性
   string inputName = ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(For?.Name);
   string skin = string.Empty;
   #region 风格
   switch (Skin)
   {
    case CheckboxSkin.默认:
     skin = "";
     break;
    case CheckboxSkin.原始:
     skin = "primary";
     break;
   }
   #endregion
   #region 单个复选框
   if (Items == null)
   {
    output.TagName = "input";
    output.TagMode = TagMode.SelfClosing;
    output.Attributes.Add("type", "checkbox");
    output.Attributes.Add("id", inputName);
    output.Attributes.Add("name", inputName);
    output.Attributes.Add("lay-skin", skin);
    output.Attributes.Add("title", SignleTitle);
    output.Attributes.Add("value", "true");
    if (For?.Model?.ToString().ToLower() == "true")
    {
     output.Attributes.Add("checked", "checked");
    }
    return;
   }
   #endregion
   #region 复选框组
   var currentValues = Generator.GetCurrentValues(ViewContext,For.ModelExplorer,expression: For.Name,allowMultiple: true);
   foreach (var item in Items)
   {
    var checkbox = new TagBuilder("input");
    checkbox.TagRenderMode = TagRenderMode.SelfClosing;
    checkbox.Attributes["type"] = "checkbox";
    checkbox.Attributes["id"] = inputName;
    checkbox.Attributes["name"] = inputName;
    checkbox.Attributes["lay-skin"] = skin;
    checkbox.Attributes["title"] = item.Text;
    checkbox.Attributes["value"] = item.Value;
    if (item.Disabled)
    {
     checkbox.Attributes.Add("disabled", "disabled");
    }
    if (item.Selected || (currentValues != null && currentValues.Contains(item.Value)))
    {
     checkbox.Attributes.Add("checked", "checked");
    }

    output.Content.AppendHtml(checkbox);
   }
   output.TagName = "";
   #endregion
  }
 }
 public enum CheckboxSkin
 {
  默认,
  原始
 }
}

Usage example


##
@{
string sex="男";
var Items=new List<SelectListItem>()
   {
    new SelectListItem() { Text = "男", Value = "男" },
    new SelectListItem() { Text = "女", Value = "女"},
    new SelectListItem() { Text = "不详", Value = "不详",Disabled=true }
   };
}
<cl-checkbox asp-items="Model.Items" asp-for="Hobby1" asp-skin="默认"></cl-checkbox>
<cl-checkbox asp-for="Hobby3" asp-title="单个复选框"></cl-checkbox>


Radio radio selection Box component encapsulation


Tag name: cl-radio


##Tag attribute: asp-for: bound field, must be specified

  1. asp-items: The binding single option type is: IEnumerable90fc9151e669273219504e6e41f84252

  2. It’s too simple, just add the code

  3. RadioTagHelper code


using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;

namespace LayuiTagHelper.TagHelpers
{
 /// <summary>
 /// 单选框
 /// </summary>
 [HtmlTargetElement(RadioTagName)]
 public class RadioTagHelper : TagHelper
 {
  private const string RadioTagName = "cl-radio";
  private const string ForAttributeName = "asp-for";
  private const string ItemsAttributeName = "asp-items";

  [ViewContext]
  public ViewContext ViewContext { get; set; }

  [HtmlAttributeName(ForAttributeName)]
  public ModelExpression For { get; set; }

  [HtmlAttributeName(ItemsAttributeName)]
  public IEnumerable<SelectListItem> Items { get; set; }

  public override void Process(TagHelperContext context, TagHelperOutput output)
  {
   if (For == null)
   {
    throw new ArgumentException("必须绑定模型");
   }
   foreach (var item in Items)
   {
    var radio = new TagBuilder("input");
    radio.TagRenderMode = TagRenderMode.SelfClosing;
    radio.Attributes.Add("id", ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(For.Name));
    radio.Attributes.Add("name", ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(For.Name));
    radio.Attributes.Add("value", item.Value);
    radio.Attributes.Add("title", item.Text);
    radio.Attributes.Add("type", "radio");
    if (item.Disabled)
    {
     radio.Attributes.Add("disabled", "disabled");
    }
    if (item.Selected || item.Value == For.Model?.ToString())
    {
     radio.Attributes.Add("checked", "checked");
    }
    output.Content.AppendHtml(radio);
   }
   output.TagName = "";
  }
 }
}

Usage example


##

@{
string sex="男";
var Items=new List<SelectListItem>()
   {
    new SelectListItem() { Text = "男", Value = "男" },
    new SelectListItem() { Text = "女", Value = "女"},
    new SelectListItem() { Text = "不详", Value = "不详",Disabled=true }
   };
}
<cl-radio asp-items="@Items" asp-for="sex"></cl-radio>

Finally come back A switch component


In fact, a single check box can be directly replaced by a switch. It happens to be available in layui, so the switch is also encapsulated separately. The code is similar

That’s it

Easy to use:

bed1dac0eb9c3735100bd7d0a7c28c95d6e4618ca9b2fd042e132fdca13ef340

<br><pre class="brush:csharp;">namespace LayuiTagHelper.TagHelpers { /// &lt;summary&gt; /// 开关 /// &lt;/summary&gt; [HtmlTargetElement(SwitchTagName)] public class SwitchTagHelper : TagHelper { private const string SwitchTagName = &quot;cl-switch&quot;; private const string ForAttributeName = &quot;asp-for&quot;; private const string SwitchTextAttributeName = &quot;asp-switch-text&quot;; protected IHtmlGenerator Generator { get; } public SwitchTagHelper(IHtmlGenerator generator) { Generator = generator; } [ViewContext] public ViewContext ViewContext { get; set; } [HtmlAttributeName(ForAttributeName)] public ModelExpression For { get; set; } [HtmlAttributeName(SwitchTextAttributeName)] public string SwitchText { get; set; } = &quot;ON|OFF&quot;; public override void Process(TagHelperContext context, TagHelperOutput output) { string inputName = ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(For?.Name); output.TagName = &quot;input&quot;; output.TagMode = TagMode.SelfClosing; if (For?.Model?.ToString().ToLower() == &quot;true&quot;) { output.Attributes.Add(&quot;checked&quot;, &quot;checked&quot;); } output.Attributes.Add(&quot;type&quot;, &quot;checkbox&quot;); output.Attributes.Add(&quot;id&quot;, inputName); output.Attributes.Add(&quot;name&quot;, inputName); output.Attributes.Add(&quot;value&quot;, &quot;true&quot;); output.Attributes.Add(&quot;lay-skin&quot;, &quot;switch&quot;); output.Attributes.Add(&quot;lay-text&quot;, SwitchText); } } }</pre>

Summary


The packaging is still very rough. Normal use is no problem. If any problems are found, please contact us. Hope pointed out.

Because layui is a form tag that is rendered directly after the page is loaded, there are not many styles related to layui.


In addition to some form components, it actually also encapsulates tabs, timelines, paging, and code display components, which will be introduced later.


Of course, interested friends can take a quick look at what components have been implemented

The above is the detailed content of Detailed example of asp.net core encapsulating layui component. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn