Получение атрибутов свойств в TagHelpers
некоторые свойства модели имеют" обязательную " аннотацию данных, которую мне нужно прочитать в классе TagHelper.
public partial class Sale
{
[Required]
public string CustomerId { get; set; }
...
в представлении продажи я создаю пользовательский выбор для клиента:
<customer asp-for="CustomerId " value="@Model.CustomerId"></customer>
и в классе CustomerTagHelper есть метод процесса:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
как я могу обнаружить на данный момент, если текущее свойство bind имеет атрибут "required"? Im использует asp-net core.
3 ответов
помощник тега не знает ни о чем, кроме того, что вы предоставляете в качестве входных данных для его атрибутов. Таким образом, вы хотите создать помощник тега, который можно использовать следующим образом:
@model WebApplication4.Models.Sale
...
<customer asp-for="CustomerId" />
тогда вы объявите свойство типа ModelSource
связан с . Это даст вам доступ не только к значению свойства, но и к метаданным, таким как следующее (и многое другое!):
- свойство value:
source.Model
- имя свойства :
source.Name
- контейнер тип модели:
source.Metadata.ContainerType
-
IsRequired флаг:
source.Metadata.IsRequired
вы также получите intellisense в VS, чтобы выбрать одно из свойств в вашей модели для asp-for
model и он выдаст ошибку, если значение не является именем свойства модели.
в качестве примера взгляните на этот помощник тега:
public class CustomerTagHelper: TagHelper
{
[HtmlAttributeName("asp-for")]
public ModelExpression Source { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "p";
output.TagMode = TagMode.StartTagAndEndTag;
var contents = $@"
Model name: {Source.Metadata.ContainerType.FullName}<br/>
Property name: {Source.Name}<br/>
Current Value: {Source.Model}<br/>
Is Required: {Source.Metadata.IsRequired}";
output.Content.SetHtmlContent(new HtmlString(contents));
}
}
тогда, если бы у вас были эти 2 модели:
public class Sale
{
[Required]
public string CustomerId { get; set; }
}
public class Promotion
{
public string CustomerId { get; set; }
}
которые используются в этих 2 действиях и представлениях:
public IActionResult Sale()
{
return View();
}
@model WebApplication4.Models.Sale
...
<customer asp-for="CustomerId" />
public IActionResult Promotion()
{
return View(new Models.Promotion { CustomerId = "abc-123" });
}
@model WebApplication4.Models.Promotion
...
<customer asp-for="CustomerId" />
произведет эти выходы:
Tag helper for: WebApplication4.Models.Sale
Property name: CustomerId
Current Value:
Is Required: True
Model name: WebApplication4.Models.Promotion
Property name: CustomerId
Current Value: abc-123
Is Required: False
Вы можете получить доступ к пользовательскому атрибуту через ModelExpression.
public class CustomTagHelper : TagHelper
{
[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
CustomAttribute attribute = For.Metadata
.ContainerType
.GetProperty(For.Name)
.GetCustomAttribute(typeof(CustomAttribute))
as CustomAttribute;
if (attribute != null)
{
output.Attributes.Add("some-attr", attribute.Text);
}
}
}
а затем просто используйте его в своем шаблоне <custom asp-for="SomeProp"></custom>
.
вы можете сделать это так:
var type = typeof(YOUR_CLASS);
var property = type.GetProperty("FIELD_NAME");
var isRequired = Attribute.IsDefined(property, typeof(Required));