Eungene's Imaginations...

ASP.net MVC 기초 - One controller, Multi views 본문

Programming/ASP.net(MVC&Core)

ASP.net MVC 기초 - One controller, Multi views

Eungene's 2015. 11. 18. 18:41
728x90
반응형

MVC 구조에 대해서 계속 언급을 하도록 하겠다.

보통 HTML을 만져본 사람이라면, 한 페이지를 만들 때마다 최소한에 1개의 html파일은 있어야 한다는 것을 알고 있을 것이다.


하지만, ASP에서는 그렇지 않다.

Home Controller.cs 파일 안에 URL이 다른 페이지들을 만들어 줄 수가 있기에
어떻게 그것이 가능한지 소스를 통해 보여주도록 하겠다.


우선, 어느때와 똑같이 ASP웹 프로젝트를 생성하고, HomeController를 생성해 주도록 하자.
그리고, 기존에 ViewResult Index() 메소드를 지워주고,

1
2
3
4
public string Index() 
{
    return "첫 페이지 입니다.";
}
cs

위와 같은 소스를 추가 시켜준다.

그리고, Index() 메소드에서 오른쪽 마우스를 눌러서 뷰 추가를 하는데, 
index View가 아니라 뷰이름을 Result로 하고, 레이아웃 페이지 사용의 체크박스를 해제한다.


그 후, Result.cshtml에서 참조할 모델을 설정을 해주어야 하는데,
맨 윗줄에 @model string을 추가해준 후,
<div>태그 안에는 @Model을 추가해주도록 한다.

이렇게 했을 시에 Result 페이지를 뿌려줄 때, Model의 값을 출력해주게 된다.
소스는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@model string
 
@{
    Layout = null;
}
 
<!DOCTYPE html>
 
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Result</title>
</head>
<body>
    <div> 
        @Model
    </div>
</body>
</html>
 
cs


그 후 바로 해주어야할 작업은 Model Class를 추가해 주는 것이다.
솔루션 탐색기에서 아래의 스크린샷과 같이 새 항목을 추가 해준다.
className은 아무거나 해준다.
Model Class이기 때문에 나처럼 ModelClass.cs 로 지정해주어도 문제 없다.



그러면 아래와 같이 코드를 추가해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
namespace oneControllerMultiViews.Models
{
    public class ModelClass
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public string Job { get; set; }
    }
}
cs

위 소스에 대해서 간단하게 언급을 하고 가자면, 모델안에서는 각각의 Name, Age, Job 메소드들이 
하나하나의 변수라고 생각하면 이해하기 쉽다.

모델까지 모두 정의 해주었다면, 이제 HomeController에서 모델을 사용하여 페이지에 뿌려주어야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
using oneControllerMultiViews.Models;
 
namespace oneControllerMultiViews.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public string Index()
        {
            //return View();
            return "첫번째 페이지";
        }
 
        public ViewResult HumanName()
        {
            ModelClass myModel = new ModelClass();
 
            myModel.Name = "John Myung";
            return View("Result", (object)string.Format("Human name: {0}", myModel.Name));
        }
 
        public ViewResult HumanAge()
        {
            ModelClass myModel = new ModelClass();
 
            myModel.Age = "35";
            return View("Result", (object)string.Format("Humna Age: {0}", myModel.Age));
        }
 
        public ViewResult HumanJob()
        {
            ModelClass myModel = new ModelClass();
 
            myModel.Job = "Bassist";
            return View("Result", (object)string.Format("Humna Job: {0}", myModel.Job));
        }
    }
}
cs


위 소스를 보면, 가장면서 모델 클래스를 사용하기 위해서  using oneControllerMultiViews.Models; 를 추가한 것을 볼 수가 있다.
oneControllerMultiViews는 이 프로젝트 네임이고, Models를 추가함으로써, models폴더 안에 있는 class들을 참조할 수
있도록 미리 선언을 해 준 것이다.

HumanName() 메소드라던지, HumanAge()메소드 등 내부 소스들을 보면,
우리들이 model Class에서 메소드를 선언한 Name, Age, Job을 보면, 흔히 우리들이 쓰는 변수와 같이
이용하는 부분들을 볼 수가 있을 것이다.

그리고, View를 반환하는데, 우리가 처음에 만들었던 Result.cshtml 파일의 <div>태그 안에 @Model 을 추가 해주었는데,
이 @Model의 값이 Format() 메소드 안에 들어 있는 값들이다.


이제 컴파일을 하고 디버깅을 해보면, 

string Index()메소드의 View가 출력이 된다.

여기서 URL을 아래의 스크린샷과 같이 바꾸면, 다른 값을 볼 수 있을 것이다.


위 URL에서 HumanName대신에 HumanAge(), HumanJob으로 넣어보면, 다른 결과값을 확인해 볼 수 있을 것이다.
중요한건, 우리들은 View를 Result.cshtml 1개만 만들었고,

HomeController에서 추가한 ViewResult형식의 메소드들 마다, 각각 독단적인 페이지를 보여줌으로써,
옛날에 페이지마다 html파일을 만들어서 링크를 걸었던것과는 많이 다른 구조를 보여주고 있다.

Controller에서 추가한 메소드들은 하나에 독단적인 View를 만들수가 있고,
혹은 1개의 View파일을 여러개의 컨트롤러 메소드들이 참조하여 쓸 수가 있다.


만약, HomeController 말고, 새로운 컨트롤러를 추가했다면,
저 URL에 Home대신에 추가한 컨트롤러에 이름으로 대체가 될 것이다.

Controller와 View의 관계를 html로 직접적으로 구조를 만들었다고 한다면,
html파일들이 들어있는 폴더들이 URL상에서는 컨트롤러와 같을 것이고, 각각에 페이지들은
html파일로 각각 관리가 되어져야 됐을 것이다.


이 컨트롤러와 뷰의 관계, 그리고 Model을 참조하여 IEnumerable형식으로 정리를 한 다음에
제대로 쓸 줄만 안다면, 향 후 ASP 프로젝트를 진행하는데 어느정도 구조가 이해는 갈 것이다.

반응형
Comments