Как получить тип атрибутов свойства в TagHelper.Process?

Я написал помощник по тегам, и мне нужно получить тип свойства Model, потому что я хочу создать экземпляр тега html на его основе.

Если тип это BooleanЯ хочу сделать пример Checkbox и так далее.

[HtmlTargetElement("edit")]
public class EditTagHelper : TagHelper
{
    [HtmlAttributeName("asp-for")]
    public ModelExpression aspFor { get; set; }

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

    protected IHtmlGenerator _generator { get; set; }

    public EditTagHelper(IHtmlGenerator generator)
    {
        _generator = generator;
    }

public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        TagBuilder instance = new TagBuilder("div");
        var propName = aspFor.ModelExplorer.Model.ToString();

        var modelExProp = aspFor.ModelExplorer.Container.Properties.Single(x => x.Metadata.PropertyName.Equals(propName));
        var propValue = modelExProp.Model;
        var propEditFormatString = modelExProp.Metadata.EditFormatString;

        var label = _generator.GenerateLabel(ViewContext, aspFor.ModelExplorer,
            propName, propName, new { @class = "col-md-2 control-label", @type = "email" });

        var typeOfProperty = // HOW CAN I GET TYPE OF PROPERTY ???;
        if (typeOfProperty == typeof(Boolean))
        {
            bool isChecked = propValue.ToString().ToLower() == "true";
            instance = _generator.GenerateCheckBox(ViewContext, aspFor.ModelExplorer, propName, isChecked, new { @class = "form-control" });
        }
    }
}

Обновлено:

UsersControll:

   [HttpGet]
    public IActionResult Edit(string id)
    {
        var propertyNames = new List<string>();
        var userProperties = typeof(User).GetProperties();

        foreach (PropertyInfo prop in userProperties)
        {
            Type type = prop.PropertyType;
            if (!(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ICollection<>)))
            {
                string attrName = string.Empty;
                var attribute = (DisplayNameAttribute)prop.GetCustomAttribute(typeof(DisplayNameAttribute), true);
                if (attribute != null)
                {
                    attrName = attribute.DisplayName;
                }
                else
                {
                    attrName = prop.Name;
                }

                propertyNames.Add(attrName);
            }
        }
        ViewData["PropertyList"] = propertyNames;

        try
        {
            if (string.IsNullOrEmpty(id))
            {
                return RedirectToAction("Index", "Users");
            }
            User user = _userManager.Users.FirstOrDefault(u => u.Id == int.Parse(id));
            return View(user);
        }
        catch (Exception)
        {
            throw;
        }
    }

Edit.cshtml:

@using System.ComponentModel
@using System.Reflection
@using Jahan.Beta.Web.App.Models.Identity
@using Jahan.Beta.Web.App.Infrastructure
@model Jahan.Beta.Web.App.Models.Identity.User

<div class="row">
@using (Html.BeginForm())
{
    var propertyNames = (List<string>)ViewData["PropertyList"];

    foreach (string item in propertyNames)
    {
        <edit asp-for="@item"></edit>
    }
    <input type="submit" value="Submit" />
}
</div>

(Если вы передаете список свойств (список PropertyInfo) от ViewData для просмотра, вы не можете получить доступ к значениям модели в EditTagHelper.cs или, по крайней мере, я не смог этого сделать! По этой причине я передал название свойства ViewData (ViewData["PropertyList"]))

1 ответ

Решение

ModelExplorer имеет ModelType, который содержит тип модели:

var typeOfProperty = modelExProp.ModelType;

Вы также можете получить тип свойства напрямую из его значения, вызвав Object.GetType():

var typeOfProperty = propValue?.GetType();
Другие вопросы по тегам