.net core Razor 보기의 Tag Helper

26126 단어 .Net.NETCoreMVC

Tag Helper


Tag Helpers는 Razor 파일에서 서버 코드를 사용하여 HTML 요소 작성 및 렌더링에 참여할 수 있습니다.Tag Helpers는 풍부한 스마트 감지 환경을 통해 HTML과 Razor 태그를 만들어 우리에게 우호적인 개발 체험을 제공하는 동시에 생성된 코드를 더욱 효율적이고 신뢰할 수 있으며 유지보수할 수 있도록 한다.Tag Helpers의 내용이 비교적 많으니 특별히 정리해 두세요...

Form Tag Helper


직접 예:
<form asp-controller="Demo" asp-action="Register" method="post">

form>

생성된 HTML:
<form method="post" action="/Demo/Register">

  <input name="__RequestVerificationToken" type="hidden" value="" />
 form>

MVC가 실행될 때 Form Tag Helper의 속성인 asp-controller와 asp-action에 따라 action의 속성 값이 생성됩니다.

이름 지정 라우팅 사용


asp-route를 통해 다음 폼에서 루트 규칙에서name이register인 루트를 사용할 수 있습니다.
<form asp-route="register" method="post">
    
form>

생성된 HTML:
<form asp-controller="Account" asp-action="Login"
  method="post" class="form-horizontal" role="form">
  
form>

Input Tag Helper


역할:


4
  • asp-for 속성에 지정된 표현식 이름에 id와name 속성을 생성합니다

  • 4
  • 모델 유형과 모델 속성에 적용되는 Tpye 특성을 바탕으로 HTML type의 속성 값을 설정합니다

  • 4
  • HTML type 속성이 지정되어 있으면 덮어쓰지 않습니다

  • 4
  • 모델 속성에 적용된 검증 특성에 따라 HTML5 검증 속성을 생성합니다

  • 위 두 번째 조항에서 TagHelper 기반NET 유형 및 특성을 사용하여 HTML type 속성을 설정합니다.다음은 흔히 볼 수 있는 것이다.NET 유형 및 특성으로 생성된 HTML 유형:
    .Net 유형 생성된 HTML 유형:
    .Net 유형
    Input 유형
    Bool
    type=”checkbox”
    String
    type=”text”
    DateTime
    type=”datetime”
    Byte
    type=”number”
    Int
    type=”number”
    Single, Double
    type=”number”
    .Net 특성으로 생성된 HTML 유형:
    Attribute
    Input Type
    [EmailAddress]
    type=”email”
    [Url]
    type=”url”
    [HiddenInput]
    type=”hidden”
    [Phone]
    type=”tel”
    [DataType(DataType.Password)]
    type=”password”
    [DataType(DataType.Date)]
    type=”date”
    [DataType(DataType.Time)]
    type=”time”
    밤을 들다.
    public class RegisterViewModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "Email Address")]
        public string Email { get; set; }
    
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }
    @model RegisterViewModel
    
    <form asp-controller="Demo" asp-action="RegisterInput" method="post">
        Email:  <input asp-for="Email" /> <br />
        Password: <input asp-for="Password" /><br />
        <button type="submit">Registerbutton>
    form>

    위 코드는 다음과 같은 HTML을 생성합니다.
    <form method="post" action="/Demo/RegisterInput">
        Email:
        <input type="email" data-val="true"
               data-val-email="The Email Address field is not a valid e-mail address."
               data-val-required="The Email Address field is required."
               id="Email" name="Email" value="" /> <br>
        Password:
        <input type="password" data-val="true"
               data-val-required="The Password field is required."
               id="Password" name="Password" /><br>
        <button type="submit">Registerbutton>
      <input name="__RequestVerificationToken" type="hidden" value="" />
    form>

    asp-for 속성 값은 ModelExpression이자 lambda 표현식 오른쪽의 부분입니다.따라서 모델 접두어를 사용할 필요가 없습니다.

    하위 속성 찾기


    asp-for는 보기 모델의 속성 경로를 통해 하위 속성에 위치할 수 있습니다.
    클래스 코드:
    // A
    public class AddressViewModel
     {
         public string AddressLine { get; set; }
     }
    // B     A
     public class RegisterAddressViewModel
     {
         public string Email { get; set; }
    
         [DataType(DataType.Password)]
         public string Password { get; set; }
    
         public AddressViewModel Address { get; set; }
     }

    보기 코드:
    @model RegisterAddressViewModel
    
    <form asp-controller="Demo" asp-action="RegisterAddress" method="post">
        Email:  <input asp-for="Email" /> <br />
        Password: <input asp-for="Password" /><br />
        Address: <input asp-for="Address.AddressLine" /><br />
        <button type="submit">Registerbutton>
    form>

    asp-for는 모델 접두사가 필요하지 않기 때문에 모델의 이메일 등 속성과 직접 연결할 수 있습니다.
    하위 속성 AddressLine의 경우 Address를 사용할 수 있습니다.AddressLine을 사용하여 바인딩합니다.

    Tag Helper 검증

    <span asp-validation-for="Email"></span>
    
    <span class="field-validation-valid"
      data-valmsg-for="Email"
      data-valmsg-replace="true">
    </span>

    일반적으로 모델 속성이 동일한 Input Tag Helper 뒤에 Validation Message Tag Helper가 사용됩니다.이렇게 하면 검증 오류가 발생한 input 옆에 오류 정보를 표시할 수 있습니다.
    HTML Helper 대체 옵션:Html.ValidationMessageFor()

    Select Tag Helper


    Select Tag Helper의 asp-for는 select 요소에 모델의 속성 이름을 지정하고 asp-items는 option 요소를 지정합니다.
    클래스 코드:
    public class CountryViewModel
    {
        public string Country { get; set; }
    
        public List Countries { get; } = new List
        {
            new SelectListItem { Value = "MX", Text = "Mexico" },
             new SelectListItem { Value = "CA", Text = "Canada" },
             new SelectListItem { Value = "US", Text = "USA"  },
        };
    }
    
    public IActionResult Index()
    {
        var model = new CountryViewModel();
        model.Country = "CA";
        return View(model);
    }

    index 보기:
    @model CountryViewModel
    
    <form asp-controller="Home" asp-action="Index" method="post">
        <select asp-for="Country" asp-items="Model.Countries">select> 
        <br /><button type="submit">Registerbutton>
    form>

    Html 생성:
    method="post" action="/">
    "__RequestVerificationToken" type="hidden" value="" />

    위의 asp-for에서 지정한 모델 유형은 단일 값 유형이지만 지정한 모델이 IEnumerable 형식으로 바뀌면 Select Tag Helper는 HTML에서 자동으로 multiple = "multiple"을 생성합니다.
    주의: asp-for가 특례라면 모델 접두사가 필요하지 않습니다.

    옵션 그룹


    옵션을 그룹화하면 HTML 요소가 생성됩니다.
    public class CountryViewModelGroup
     {
         public CountryViewModelGroup()
         {
            var AmericaGroup = new SelectListGroup { Name = "America" };
            var EuropeGroup = new SelectListGroup { Name = "Europe" };
            public string Country { get; set; }
    
            public List Countries { get; } = new List
             {            
                 new SelectListItem
                 {
                     Value = "CAN",
                     Text = "Canada",
                     Group = AmericaGroup
                 },
                 new SelectListItem
                 {
                     Value = "US",
                     Text = "USA",
                     Group = AmericaGroup
                 },
                 new SelectListItem
                 {
                     Value = "FR",
                     Text = "France",
                     Group = EuropeGroup
                 },
                 new SelectListItem
                 {
                     Value = "ES",
                     Text = "Spain",
                     Group = EuropeGroup
                 },            
           };
         }
     }

    나머지 작업은 위의 Select Tag Helper와 비슷합니다...

    Select Tag Helper의 열거 바인딩

    public enum CountryEnum
    {
        Mexico,
        [Display(Name = "United States of America")]
        USA,
        Canada,
        France,
        Germany,
        Spain
    }
    
    public class CountryEnumViewModel
     {
         public CountryEnum EnumCountry { get; set; }
     }

    보기:
    @model CountryEnumViewModel
    
    <form asp-controller="Home" asp-action="IndexEnum" method="post">
        <select asp-for="EnumCountry" 
                asp-items="Html.GetEnumSelectList()"> >
        select> 
        <br /><button type="submit">Registerbutton>
    form>

    HTML 생성:
    method="post" action="/Home/IndexEnum">
    "__RequestVerificationToken" type="hidden" value="" />

    Html Helper와 Input Tag Helper 기능의 차이점

  • Html.TextBox、Html.TextBoxFor、Html.Editor 및 Html.EditorFor는 Input Tag Helper와 중복되는 기능을 가지고 있습니다

  • 4
  • Input Tag Helper는 type 속성을 자동으로 설정하고 Html.TextBox 및 Html.TextBoxFor는 그렇지 않습니다
  • Html.Editor 및 Html.EditorFor는 컬렉션, 복합 객체 및 템플릿을 처리하지만 Input Tag Helper는 그렇지 않습니다
  • Input Tag Helper 、Html.EditorFor 및 Html.TextBoxFor는 강한 타입이지만 Html.TextBox 및 Html.Editor는 그렇지 않습니다

  • 4
  • HTML Helper의 Html.TextAreaFor、Html.LabelFor는 Textarea Tag Helper, Label Tag Helper와 유사합니다

  • 4
  • Tag Helper는 HTML Helpers에 비해 훨씬 깨끗하고 읽기 쉽고 편집과 유지보수가 용이합니다

  • 추가:사용자 지정 태그


    클래스 만들기는 TagHelper에서 상속되므로 TagHelper의 기능을 확장할 수 있습니다.
    <email>Supportemail>
    //[HtmlTargetElement(Attributes = "email")]
    public class EmailTagHelper : TagHelper
    {
        private const string EmailDomain = "contoso.com";
    
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "a";    // Replaces  with tag
    
            var address = MailTo + "@" + EmailDomain;
            output.Attributes.SetAttribute("href", "mailto:" + address);
            output.Content.SetContent(address);
        }
    }

    Description:
    4
  • Taghelper는 대상 요소 이름을 루트 클래스 이름으로 사용합니다. 이 예에서 EmailTagHelper의 루트 이름은 이메일이기 때문에 TagName의 기본값은 이메일입니다

  • 4
  • Process를 다시 쓰는 방법은 Tag Helper가 실행하는 과정에서의 행동을 제어할 수 있습니다.TagHelper 클래스는 동일한 매개변수의 비동기 버전(ProcessAsync)을 제공합니다

  • 4
  • 클래스 이름 접미사 TagHelper는 필요하지 않지만 최상의 관례적인 약속으로 여겨집니다

  • 4
  • Razor에서 사용자 정의 TagHelper를 사용할 수 있도록 Views/ViewImports.cshtml 파일에는 addTagHelper 명령을 통해 사용자 정의 TagHelper를 포함하는 이름공간이 추가됩니다

  • 4
  • [HtmlTargetElement] 속성은 HTML 요소에 "bold"라는 HTML 속성이 포함되도록 지정하는 속성 매개 변수를 전달합니다.예를 들어 [HtmlTargetElement("email")]과 [HtmlTargetElement(Attributes="email")]을 모두 사용하면 bold 태그와 bold 속성이 일치합니다
  • //  Process
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "a";                                 // Replaces  with tag
        var content = await output.GetChildContentAsync();
        var target = content.GetContent() + "@" + EmailDomain;
        output.Attributes.SetAttribute("href", "mailto:" + target);
        output.Content.SetContent(target);
    }

    참고 자료


    ASP.NET Core 중국어 문서 제4장 MVC(3.4)에서 양식을 사용하는 방법:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_3_4-working-with-forms.html ASP.NET Core 중국어 문서 제4장 MVC(3.6.1) Tag Helpers 소개:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_3_6_1-introduction-to-tag-helpers.html ASP.NET Core 중국어 문서 제4장 MVC(3.6.2) 사용자 정의 태그 보조 클래스(Tag Helpers):http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_3_6_2-tag-helpers-authoring.html

    좋은 웹페이지 즐겨찾기