ASP.NET Core MVC 네 가지 매 거 진 바 인 딩 방식

10991 단어 .netcore매 거
머리말
이 절 에 서 는 ASP.NET Core MVC 가 우리 에 게 어떤 편 의 를 제공 하 는 지 에 대해 이야기 합 니 다.전에 우 리 는 ASP.NET MVC 에서 드 롭 다운 박스 바 인 딩 방식 을 연 구 했 습 니 다.이 절 에 서 는 매 거 바 인 딩 방식 을 중점적으로 살 펴 보고 당신 이 생각 할 수 있 는 장면 을 충분히 실현 하 며 건어물 이 가득 합 니 다.당신 은 가 질 가치 가 있 습 니 다.
매 거 바 인 딩 방식 검토
우 리 는 우선 귀속 할 매 거 진 종 류 를 제시한다.

  public enum Language
  {
    JavaScript,
    Java,
    C,
    Python,
    SQL,
    Oracle
  }
열 거 된 바 인 딩 방식 1(@Html.DropDownlList)
이제 쓸데없는 소리 하지 말고 바로 주제 로 들 어가 자.

ViewBag.enums = Enum.GetValues(typeof(Language)).Cast<Language>();
보기 페이지 는 이 ViewBag 의 값 을 가 져 옵 니 다.

@Html.DropDownList("enumList", new SelectList(ViewBag.enums), new { @class = "btn btn-success dropdown-toggle form-control" })

바 인 딩 방식 2(@Html.EnumDropDownListFor)
이 때 우 리 는 강력 한 유형의 보 기 를 통 해 다음 과 같은 컨트롤 러 코드 를 조작 해 야 한다.

    [HttpGet]
    public IActionResult Get()
    {
      var test = new TestViewModel();
      return View(test);
    }
그리고 보기 코드:

@Html.EnumDropDownListFor(model => model.Language, htmlAttributes: new { @class = "form-control" })
그리고 ASP.NET Core 에서  MVC 에 서 는 이 방법 이 실현 되 지 않 았 습 니 다.구체 적 으로 다음 과 같 습 니 다.
 
그래서 여기 서 우리 의 연구 가 끝 났 습 니 다.이 방법 은.net core 뮤 직 비디오 팀 에 의 해 버 려 졌 고 우 리 는 계속 아래 를 내 려 다 보 았 습 니 다.
*매 거 진 바 인 딩 방식 3(Html.GetEnumSelectList)
(1)단독 귀속 매 거 진
이때 우리 가@Html 을 두 드 리 러 갈 때 Razor 보기 스마트 알림 이 나타 납 니 다.다음 과 같은 방법 을 볼 수 있 습 니 다.이 방법 은 ASP.NET MVC 5 이후 와 ASP.NET Core MVC 에서 만 있 을 수 있 고 이 방법의 매개 변 수 는 Type 형식 입 니 다.

 @Html.GetEnumSelectList()
그러면 이때 우리 의 보기 코드 는 다음 과 같이 변 했다.

@{
  Layout = null;
}

<!DOCTYPE html>

@using WebApplication1.Enums
<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Index</title>
</head>
<body>
  @Html.GetEnumSelectList(typeof(Language))
</body>
</html>

oh,shit,돌아 온 것 은 SelectList Item 입 니 다.소 용 없 을 것 같 습 니 다.마지막 으로 다음 방법 을 시도 해 보 았 습 니 다.

@{
  Layout = null;
}
<!DOCTYPE html>

@using WebApplication1.Enums
<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Index</title>
</head>
<body>
  <select asp-items="@Html.GetEnumSelectList(typeof(Language))"></select>
</body>
</html>


이것 이 야 말로 우리 가 최종 적 으로 원 하 는 것 입 니 다.우 리 는 강 한 유형 보 기 를 통 해 이 루어 질 필요 가 없습니다.매 거 진 방법 이 있 습 니 다.간단 하고 거 칠 지만 select 에 asp-for="옵션 을 추가 하지 마 십시오.그렇지 않 으 면 다음 과 같은 오류 가 발생 할 수 있 습 니 다.이것 은 연구 하지 않 았 습 니 다.강 한 유형 보기 와 연결 되 어 있 을 것 입 니 다.
 
비록 상술 한 것 은.net core 가 우리 에 게 제공 하 는 가장 좋 은 방안 이지 만,확실히 매우 좋 지만,우리 가 실제 적 으로 원 하 는 효 과 는 그렇지 않다.우 리 는 다음 과 같은 실제 장면 을 들 어 보 자.

  public enum PayStatus
  {
    Create,
    WaitPay,
    WaitConfirm,
    Successed,
    Failed,
    NoPay
  }
위 에 표 시 된 것 은 지불 의 몇 가지 상태 입 니 다.보기 에 표 시 될 때 Create,WaitPay,WaitConfirm 등 을 실현 할 수 없습니다.누가 알 겠 습 니까?우리 가 원 하 는 것 은 이 매 거 진 설명 정 보 를 원 하 는 것 입 니 다.결 과 는 다음 과 같 습 니 다.

  public enum PayStatus
  {
    [Display(Name = "  ")]
    Create,
    [Display(Name = "    ")]
    WaitPay,
    [Display(Name = "      ")]
    WaitConfirm,
    [Display(Name = "    ")]
    Successed,
    [Display(Name = "    ")]
    Failed,
    [Display(Name = "    ")]
    NoPay
  }
이때 우 리 는 여전히 상술 한 방법 을 빌려 실현 한다.아래 는 매 거 유형 만 수정 하면 된다.

 <select asp-items="@Html.GetEnumSelectList(typeof(PayStatus))"></select>

.net core mvc 는 여전히 매우 강력 합 니 다.이렇게 해석 할 수 있 습 니 다.상기 우 리 는 직접 바 인 딩 매 거 진 을 통 해 이 루어 집 니 다.만약 에 강 한 유형 보 기 를 통 해 우 리 는 다음 과 같이 보 겠 습 니 다.
(2)강 한 유형 보기 바 인 딩 매 거 진

  public class TestViewModel
  {
    public PayStatus PayStatus { get; set; }
  }
이 방법 은 두 개의 리 셋 이 있 습 니 다.다음 과 같 습 니 다.하 나 는 단독 바 인 딩 매 거 진 입 니 다.하 나 는 강 한 유형 보 기 를 바 인 딩 하 는 매 거 진 유형 입 니 다.

    //
    //   :
    //   Returns a select list for the given enumType.
    //
    //   :
    //  enumType:
    //   System.Type to generate a select list for.
    //
    //     :
    //   An System.Collections.Generic.IEnumerable`1 containing the select list for the
    //   given enumType.
    //
    //   :
    //  T:System.ArgumentException:
    //   Thrown if enumType is not an System.Enum or if it has a System.FlagsAttribute.
    IEnumerable<SelectListItem> GetEnumSelectList(Type enumType);
    //
    //   :
    //   Returns a select list for the given TEnum.
    //
    //     :
    //  TEnum:
    //   Type to generate a select list for.
    //
    //     :
    //   An System.Collections.Generic.IEnumerable`1 containing the select list for the
    //   given TEnum.
    //
    //   :
    //  T:System.ArgumentException:
    //   Thrown if TEnum is not an System.Enum or if it has a System.FlagsAttribute.
    IEnumerable<SelectListItem> GetEnumSelectList<TEnum>() where TEnum : struct;

 상술 한 것 이 뜻밖에도 잘못 을 갚 았 는데 도 여전히 자기 고집 대로 하 니 결국 잘못 도 없 구나.아래 와 같이 답답 하 다.
 
물론 이 를 바탕 으로 보기 에 기본 옵션 을 추가 할 수 있 습 니 다.다음 과 같 습 니 다.

  <select asp-items="Html.GetEnumSelectList<PayStatus>()">
    <option>---no specified----</option>
  </select>

중국 어 를 추가 할 때,당신 은 결과 가 엉망 이 되 었 다 는 것 에 놀 랄 것 입 니 다.이것 이 bug 입 니까?

  <select asp-items="Html.GetEnumSelectList<PayStatus>()">
    <option>---"   "----</option>
  </select>

 무슨 영문 인지 이 문 제 를 해결 해 주세요.bug??????난 아니 라 고 생각해...
매 거 바 인 딩 방식 4(TagHelper)
상술 한 세 번 째 방안 은 사실 우리 가 사용 하기에 충분 하지만,때때로 실제 상황 은 우리 가 상상 한 것 처럼 우리 프로젝트 에서 매 거 진 유형 에 대한 묘 사 는 다음 과 같은 가방 을 사용한다.
System.ComponentModel.Primitives
 
그래서 이때 매 거 는 다음 과 같다.

  public enum PayStatus
  {
    [Description("  ")]
    Create,
    [Description("    ")]
    WaitPay,
    [Description("      ")]
    WaitConfirm,
    [Description("    ")]
    Successed,
    [Description("    ")]
    Failed,
    [Description("    ")]
    NoPay
  }
DisplayName 기능 을 사용 할 때 보기 와 결합 되 어 있 기 때문에 Razor 엔진 은 해석 할 수 있 지만 Description 기능 으로 바 뀌 면 사용 하기 어 려 울 것 입 니 다.다음 과 같 습 니 다.
 
다음은 Description Attribute 의 값 만 사용자 정의 로 가 져 올 수 있 습 니 다.우 리 는 TagHelper 를 통 해 이 루어 집 니 다.그러면 매 거 진 것 에 대해 더 이상 제한 이 없고 마음대로 할 수 있 습 니 다.우선,우 리 는 상기 특성 을 가 져 오고 그 값 을 가 져 와 서 SelectList Item 에 추가 하여 집합 을 만들어 야 합 니 다.코드 는 다음 과 같 습 니 다.

    public List<SelectListItem> GetEnumSelectListItem()
    {
      var list = new List<SelectListItem>();
      var typeInfo = Value.GetType().GetTypeInfo();
      var enumValues = typeInfo.GetEnumValues();

      foreach (var value in enumValues)
      {

        MemberInfo memberInfo =
          typeInfo.GetMember(value.ToString()).First();

        var descriptionAttribute =
          memberInfo.GetCustomAttribute<DescriptionAttribute>();

        list.Add(new SelectListItem()
        {
          Text = descriptionAttribute.Description,
          Value = value.ToString()
        });
      }

      return list;
    }
다음 에 우 리 는 상기 집합 에 있 는 값 을 꺼 내 서 Select 에 추가 합 니 다.최종 코드 는 다음 과 같 습 니 다.

  public class EnumsTagHelper : TagHelper
  {
    public Enum Value { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
      var list = GetEnumSelectListItem();

      output.Content.AppendHtml("<select>");
      foreach (var item in list)
      {
        if (item.Value != null)
          output.Content.AppendHtml($"<option value='{item.Value}'>{item.Text}</option>");
        else
          output.Content.AppendHtml($"<option>{item.Text}</option>");
      }
      output.Content.AppendHtml("<select/>");
    }
  }
마지막 으로 보기에 서 호출 되 었 습 니 다.다음 과 같 습 니 다.

@using WebApplication1.Enums
@addTagHelper *, WebApplication1

<html>
<head>
  <meta name="viewport" charset="utf-8" />
  <title>Index</title>
  
</head>
<body>
  <enums Value="@PayStatus.Create"></enums>
</body>
</html>

모든 것 이 그렇게 간단 한데,너 는 얻 었 니?
총결산
이 절 은 ASP.NET Core MVC 에서 매 거 진 방식 을 어떻게 연결 하 는 지 상세 하 게 소개 합 니 다.매 거 진 것 은 좋 은 설명 을 통 해 더욱 의미 가 있 습 니 다.DisplayName 특성 을 이용 하 는 것 이 라면 내 장 된 것 으로 내 부 를 자동 으로 해석 합 니 다.설명 특성 을 이용 하면 상기 TagHelper 를 이용 하여 이 루어 질 수 있 습 니 다.어떤 것 을 좋아 하 는 지,어떤 것 을 사용 하 는 지,그 다음 에 저 는 주말 시간 을 이용 하여 스 레 드 시 리 즈 를 업데이트 할 것 입 니 다.또한.NET Core 글 을 포함 하여 SQL Server 성능 최적화 시 리 즈 를 잠시 보류 할 수도 있 습 니 다.

좋은 웹페이지 즐겨찾기