HTML Helper 만들고 TagBuilder 사용하기

 

ASP.NET MVC 프레임웍은 HTML Helper를 만들때 TagBuilder라는 utility 클래스를 사용한다.

TagBulider 클래스는 손쉽게 HTML 태그를 만드는 것을 가능하게 하고 생각하네 하는 클래스이다.

 

TagBulider클래스는 System.Web.Mvc 네임스페이스에서 제공되고 5개의 Method를 가지고 있다.

 

AddCssClass()

새로운 Class=”” 속성을 추가

GenerateId()

Id 속성 추가

MergeAttribute()

속성을 추가. 다수의 overload 제공

SetInnerText()

Inner text 추가.

ToString()

기본적인 tag, “<”, “>”, “< />”

 

 

Image HTML Helper 만들기

tag명을 넣어 TagBuilder 생성자를 통해 TagBuilder Class의 인스턴스를 만든다.

다음으로 태그의 속성을 수정하기 위해 AddCssClass MergeAttribute() 메소드를 호출한다.

마지막으로 ToString() 메소를 호출하여 태그를 제공한다.

 

/Helpers/ImageHelper.cs

 

using System.Web.Mvc;

using System.Web.Routing;

 

namespace MvcMyApplication4.Helpers

{

    public static class ImageHelper

    {

        public static string Image(this HtmlHelper helper, string id, string url, string alternateText)

        {

            return Image(helper, id, url, alternateText, null);

        }

 

        public static string Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)

        {

            // Create tag builder

            var builder = new TagBuilder("img");

 

            // Create valid id

            builder.GenerateId(id);

 

            // Add attributes

            builder.MergeAttribute("src", url);

            builder.MergeAttribute("alt", alternateText);

            builder.MergeAttributes(new RouteVal!ueDictionary(htmlAttributes));

 

            // Render tag

            return builder.ToString(TagRenderMode.SelfClosing);

        }

    }

}

 

/Home/Index.aspx

 

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<%@ Import! Namespace="MvcMyApplication4.Helpers" %>

 

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">

    Home Page

</asp:Content>

 

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

 

    <!-- Calling helper without HTML attributes -->

    <%= Html.Image("img1", ResolveUrl("~/Content/XBox.png"), "XBox Console") %>

 

    <!-- Calling helper with HTML attributes -->

    <%= Html.Image("img1", ResolveUrl("~/Content/XBox.png"), "XBox Console", new {border="4px"})%>

 

</asp:Content>

 

 

 

 

<%@ Import! Namespace="MvcMyApplication4.Helpers" %> index.aspx view의 상단에 반드시 import! 해야 한다.

'Web Platform' 카테고리의 다른 글

ASP.NET MVC 액션 필터  (0) 2009.06.29
ASP.NET MVC 마스터 페이지  (0) 2009.06.29
ASP.NET MVC View  (0) 2009.06.29
ASP.NET MVC Routing 기술  (0) 2009.06.29
ASP.NET MVC 개발 환경 만들기  (0) 2009.06.29

데이터베이스 데이터 테이블 출력하기

HTML Table에 데이터베이스 레코드를 구성하는 2개의 Method를 보자

 

Database 만들기

프로젝트에 App_Data폴더 오른쪽 버튼을 클릭하여 추가에 새 항목을 선택하면 다음과 같은 화면이 나온다.

 

 데이터 -> SQL Server 데이터베이스 선택 후 이름은 Movies.mdf 로 한 후 추가 버튼을 클릭한다.

 

 

Model Class 만들기

Movies 데이터베이스 테이블의 레코드 구성을 보여주는 것부터 출발한다. Movies 데이터베이스 테이블은 다음과 같은 컬럼으로 구성되어 있다.

 

Table : tblMovie

Column Name

Data Type

Allow Nulls

Id

Int

False

Title

Nvarchar(200)

False

Director

NVarchar(50)

False

DateReleased

DateTime

False

 

Movies 데이터베이스 테이블 나타내는 순서로는 LINQ to SQL 데이터 접근 기술을 사용할 것이다.

다른 단어로는 MVC model classes by using LINQ to SQL

 

프로젝트에 보면 Models폴더가 있는데 Models폴더 오른쪽 버튼을 클릭하여 추가에 새 항목을 선택하면 다음과 같은 화면이 나온다.

데이터 -> LINQ to SQL 클래스 선택 후 이름은 Movie.dbml로 한 후 추가버튼을 클릭한다.

 

 

서버탐색기에서 만든 테이블을 Movie.dbml에 끌어다 놓으면 다음과 같이 출력된다.

 (테이블의 컬럼은 알아서 만들어 보자 )

여기까지 데이터베이스 생성 및 Models LINQ to SQL 파일 생성이 모두 완료되었다.

 

 

Controller Action LINQ to SQL 사용하기

Controller에서 LINQ to SQL을 사용하려면

Using System.Linq; Using 프로젝트명.Models; 를 선언해야 한다.

 

using System.Linq; // 추가

using System.Web.Mvc;

using MvcMyApplication3.Models; //추가

 

namespace MvcMyApplication3.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        public ActionResult Index()

        {

            // 사용할 ModelsLINQ to SQL Class

            var dataContext = new MovieDataContext();  

            var movies = from m in dataContext.tblMovie // 테이블명

                         select m;

            return View(movies);

        }

    }

}

 

View에 데이터 출력하기

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<%@ Import! Namespace="MvcMyApplication3.Models" %>

 

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">

    Home Page

</asp:Content>

 

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

 

<table>

<tr>

     <th>Id</th><th>Title</th><th>Release Date</th>

</tr>

<% foreach (tblMovie m in (IEnumerable)ViewData.Model)

{ %>

<tr>

     <td><%= m.id %></td>

     <td><%= Html.Encode(m.Title) %></td>

     <td><%= m.DateReleased %></td>

</tr>

<% } %>

</table>

 

</asp:Content>

 

 여기까지 View page에 데이터 출력하는 것이 완료 되었다.

MVC
에서는 Routing Controller Method를 통해 View page를 호출을 한다

using System.Web.Mvc;

 

namespace MvcMyApplication2.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        public ActionResult Index()

        {

            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();

        }

 

        public ActionResult About()

        {

            return View();

        }

 

        public ActionResult Detail()

        {

            return RedirectToAction("Index");

        }

     }

}

HomeController 에는 3개의 Index(), About(), Detail() action Method가 있다.

 

action은 다음과 같이 주소표시줄에 표기된다.

Index()

/Home/Index

About()

/Home/About

Detail()

/Home/Detail

 

Index() action view를 리턴한다. 어떤 action은 다른 type action 결과를 리턴할 수 있다.

예를 들어 Detail() action처럼 Index() action을 요청하는 RedirectToActionResult를 리턴할 수 있다.

 

Index() action View();

반드시 웹서버에 \Views\Home\Index.aspx가 있어야 한다.

 

만약 View(“Fred”); 를 리턴하면

\Views\Home\Fred.aspx 실행된다.

 

View에 내용추가

View는 다양한 script내용을 포함할 수 있는 html문서이다.

예를 들어 날짜를 출력하는 view를 보겠다.

  

Add.aspx

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

    <title>Add</title>

</head>

<body>

    <div>

       

    The current date and time is<br />

    <% Response.Write(DateTime.Now); %>

 

    </div>

</body>

</html>

이 구분기호 <% %> C#에서 쓰여진 script이다.

Response.Write() Method는 브라우저 내용에 현재 날짜를 보여준다.

이 구분기호 <% %>은 하나 또는 더 많은 세크먼트를 실행하는데 사용된다.

 

Result

The current date and time is
2009-04-18
오후 10:45:43

Add2.aspx

<%@ Page Title=”” Language=”C#” Inherits=”System.Web.Mvc.ViewPage” %>

 

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

 

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head id=”Head1” runat=”server”>

    <title>Add</title>

</head>

<body>

    <div>

 

    The current date and time is<br />

    <%=DateTime.Now %>

 

    </div>

</body>

</html>

<%=%> 구분기호는 Response.Write() 를 간략하게 쓰는 기호이다.

Result

The current date and time is
2009-04-18
오후 10:45:43

 

 

View에서 HTML Helper 사용하기

HTML HelperTextbox, Link, Dropdown List, List Box등의 표준 HTML 요소를 사용할 수 있게 한다.

 

Login.aspx

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

    <title>Login Form</title>

</head>

<body>

    <div>

   

    <% using (Html.BeginForm())

       { %>

        

        <label for="UserName">User Name:</label>

        <br />

        <%= Html.TextBox("UserName") %>

       

        <br /><br />

           

        <label for="Password">Password:</label>

        <br />

        <%= Html.Password("Password") %>

       

        <br /><br />

 

        <input type="submit" value="Log in" />       

   

    <% } %>

   

    </div>

</body>

</html>

HTML Source

<form action="/Home/Login" method="post">

 

        <label for="UserName">User Name:</label>

        <br />

        <input id="UserName" name="UserName" type="text" value="" />

       

        <br /><br />

           

        <label for="Password">Password:</label>

        <br />

        <input id="Password" name="Password" type="password" />

       

        <br /><br />

 

        <input type="submit" value="Log in" />       

   

    </form>

 

위에서 보듯이 HTML Helper는 각 HTML 요소로 변경된다. 기존의 서버컨트롤과는 다른 string만 변경하여 리턴을 해준다. ( 랜더링 작업이 없다. )

 

 

View View Data 사용하기

Controller 에서 ViewData["Message"] = "Welcome to ASP.NET MVC!"; 설정하면

ViewData["Message"]View Page에서 사용할 수 있다.

<%= Html.Encode(ViewData["Message"]) %> 하면 View Page Welcome to ASP.NET MVC! 라고 출력이 된다.

 

 

Custom HTML Helper 만들기

ASP.NET MVC HTML Helper의 종류는 다음과 같다.

  • Html.ActionLink()
  • Html.BeginForm()
  • Html.CheckBox()
  • Html.DropDownList()
  • Html.EndForm()
  • Html.Hidden()
  • Html.ListBox()
  • Html.Password()
  • Html.RadioButton()
  • Html.TextArea()
  • Html.TextBox()

<label>관련된 static Method를 만들려고 한다.

우리가 가끔 string 관련 함수를 만들어 return 하는 방식과 같다.

Helpers/LabelHelper.cs

using System;

 

namespace MvcMyApplication2.Helpers

{

    public class LabelHelper

    {

        public static string Label(string target, string text)

        {

            return String.Format("<label for='{0}'>{1}</label>", target, text);

        }

    }

}

HTML 요소의 특성에 맞게 파라메터를 받고 스트링 문자열을 만들어 return 한다.

이렇게 만든 클래스를 사용해보자

 

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<%@ Import! Namespace="MvcMyApplication2.Helpers " %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

     <title>Index2</title>

</head>

<body>

     <div>

          <% using (Html.BeginForm())

          { %>

               <%= LabelHelper.Label("firstName", "First Name:") %>

               <br />

               <%= Html.TextBox("firstName")%>

               <br /><br />

               <%= LabelHelper.Label("lastName", "Last Name:") %>

               <br />

               <%= Html.TextBox("lastName")%>

               <br /><br />

               <input type="submit" value="Register" />

          <% } %>

     </div>

</body>

</html>

 

Result

 

 

HTML Helpers Extension Method 만들기

HtmlHelper 클래스에 Label() 확장 메소드를 추가하기

1.     클래스는 Static class

2.     Static classExtension Method를 정의 해야한다.

 

Helpers/LabelExtensions.cs

using System;

using System.Web.Mvc;

 

namespace MvcMyApplication2.Helpers

{

    public static class LabelExtensions

    {

        public static string Label(this HtmlHelper helper, string target, string text)

        {

            return String.Format("<label for='{0}'>{1}</label>", target, text);

        }

    }

}

 

작성 후 View Page Import! 하면 아래 그림과 같이 출력이 된다.

 

 

 

'Web Platform' 카테고리의 다른 글

ASP.NET MVC 마스터 페이지  (0) 2009.06.29
ASP.NET MVC TagBuilder  (0) 2009.06.29
ASP.NET MVC Routing 기술  (0) 2009.06.29
ASP.NET MVC 개발 환경 만들기  (0) 2009.06.29
ASP.NET MVC(Model, View, Controller)란?  (0) 2009.06.29

+ Recent posts