C#

MVC Html Helpers

MVC View에서 HTML을 손쉽게 생성하기 위하여 Html Helper를 제공하고 있다. Html Helper는 모두 @Html 으로 시작하는데, 여기서 @은 Razor 문법이며 View 클래스(WebViewPage)의 Html 속성을 호출한다는 의미이다. 아래는 MVC View 클래스의 Base 클래스인 WebViewPage 클래스의 일부 멤버들인데, 여기서 Html 속성이 HtmlHelper 클래스 타입임을 볼 수 있다.

// MVC View의 Base 클래스
// 제네릭 버전의 WebViewPage<TModel> 클래스도 있음

public abstract class WebViewPage : WebPageBase
{
	public AjaxHelper<object> Ajax { get; set; }
	public override HttpContextBase Context { get; set; }
	public HtmlHelper<object> Html { get; set; }  // HtmlHelper
    public UrlHelper Url { get; set; }

    // 생략

    // Controller에서 전달되는 모델과 데이타 속성
	public object Model { get; }	
	public dynamic ViewBag { get; }
	public ViewDataDictionary ViewData { get; set; }
	public TempDataDictionary TempData { get; }		
}
HtmlHelper는 HTML을 쉽게 생성하기 위한 많은 메서드들을 가지고 있는데, 이들은 확장메서드(Extension Method) 형태로 구현되어 있다.

일반 HTML 대신 HtmlHelper를 사용하면 좋은 때는 모델 데이타 혹은 View 데이타를 바인딩 할 때이다. 즉, HtmlHelper는 데이타 바인딩을 쉽게 할 수 있는 기능을 제공하고 있다.
HtmlHelper는 크게 (1) Html.TextBox()와 같은 형태의 Weakly Typed 메서드와 (2) Html.TextBoxFor()와 같이 뒤에 For로 끝나는 Strongly Typed 메서드로 구분할 수 있다.
아래 예제는 Html.TextBox()와 Html.TextBoxFor()를 사용한 예이다.

@using GuestBook.Models
@model Guest
@{
    ViewBag.Title = "Guest Details";
}

<p>
    @Html.TextBox("Name", null, new { @class = "form-control" })
    <br />
    @Html.TextBoxFor(m => m.Message, new { @class = "form-control" })
    <br />
    Id: @Html.TextBoxFor(m => m.Id)
</p>

위 예제의 라인 8의 @Html.TextBox()는 첫번째 파라미터로 "Name" 을 지정하고 있는데, 이는 모델의 (여기서는 라인 2에 지정한 대로 Guest 객체) Name 속성을 사용한다는 의미이다. 여기서 Name 속성을 문자열로 지정했기 때문에 @Html.TextBox()가 Reflection을 사용한다는 면에서 Weakly Typed 메서드라 볼 수 있다. 두번째 파라미터는 텍스트 박스의 값인데, null로 지정하면 Guest.Name 속성을 표시하고 null이 아닌 문자열을 지정하면 지정한 문자열을 값을 설정한다. 세번째 파라미터는 HTML의 기타 attributes를 나타내는 익명 타입의 객체인데, HTML의 style이나 class 등의 attributes를 지정할 수 있다. Html.TextBox()는 여러 메서드 오버로드를 가지고 있으며, 첫번째 파라미터를 제외하고 Optional이다. 위의 Html.TextBox()는 예를 들어 아래와 같은 HTML로 변환된다.

<input class="form-control" id="Name" name="Name" type="text" value="Alex" />

위 예제의 라인 10의 @Html.TextBoxFor()는 첫번째 파라미터로 람다식을 지정하고 있는데, 람다식의 입력은 사용할 모델 객체 (Guest 객체) 이고, 출력은 바인딩할 그 모델의 속성이다. 즉, 라인 10에서는 Guest 모델 객체를 m 으로 받아들여 m.Message 속성을 리턴하는 것이다. Html.TextBoxFor()는 이 람다식을 사용해서 어떤 속성을 <input type="text" /> 안에 사용할 지를 결정한다. Html.TextBoxFor()는 여러 메서드 오버로드를 가지고 있으며, 첫번째 파라미터를 제외하고 Optional이다. 위의 Html.TextBoxFor()는 예를 들어 아래와 같은 HTML로 변환된다.

<input class="form-control" id="Message" name="Message" type="text" value="Congrats!" />

HtmlHelper로 자주 사용되는 기본 메서드들은 아래 표와 같다.

HtmlHelper Strogly Typed 비고
Html.ActionLink 없음 a tag
Html.TextBox Html.TextBoxFor
Html.TextArea Html.TextAreaFor
Html.Display Html.DisplayFor
Html.DisplayForModel
모델 속성의 템플릿 사용하여 출력
모델 전체에 대해 템플릿 적용 출력
Html.Label Html.LabelFor <label> 태그
Html.Editor Html.EditorFor

Html.EditorForModel
모델 속성의 데이타 타입에 따라 HTML 생성
모델 전체에 대해 템플릿 적용하여 HTML 생성
Html.CheckBox Html.CheckBoxFor
Html.RadioButton Html.RadioButtonFor
Html.DropDownList Html.DropDownListFor
Html.ListBox Html.ListBoxFor
Html.Hidden Html.HiddenFor
Password Html.PasswordFor

HtmlHelper는 Model 클래스에 지정된 특성(attribute)들을 사용할 수 있다. 예를 들어, 아래 예제에서 Html.LabelFor()는 Guest 모델 클래스의 Display Name 값을 읽어 표시하고, Html.DisplayFor()는 DisplayFormat 에 지정된 날짜 포맷을 읽어 표시한다.

// Model 클래스에 Display* 특성 지정
public class Guest
{
    public int Id { get; set; }
    public string Name { get; set; }

    [Display(Name="작성일자")]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
    public DateTime CreateDate { get; set; }

    public string Message { get; set; }
}


// View에서 LabelFor와 DisplayFor 사용
@model GuestBook.Models.Guest
<p>
    @Html.LabelFor(m => m.CreateDate)    @*작성일자 표시*@
    @Html.DisplayFor(m => m.CreateDate)  @*날짜를 yyyy-MM-dd 로*@ 
</p>

위 코드에 대한 HTML 은 출력은 아래와 같다.
작성일자 2017-02-11 

모델 전체에 대해 커스텀 템플릿을 만들고, Html.DisplayForModel() 혹은 Html.EditorForModel()을 사용하여 해당 모델 데이타를 출력하거나 편집하게 할 수도 있다.

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

Previous Next Print