ASP.NET Core MVC 네 가지 매 거 진 바 인 딩 방식
이 절 에 서 는 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 성능 최적화 시 리 즈 를 잠시 보류 할 수도 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
.net 데이터베이스 조작 프레임워크 SqlSugar의 간단한 시작SqlSugar는 오래된 브랜드입니다.NET 데이터베이스 조작 프레임워크, 과당 빅데이터 과학기술팀이 유지 보수 및 업데이트, Github star 수 EF 및 Dapper 버금가 지원 데이터베이스: MySql, S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.