Programming/.NET

1. 요청값 처리

 

ASP.NET MVC에서는 컨트롤러와 뷰를 나타내는 세그먼트 이외에 다른 값은 컨트롤러의 매개변수로서 처리할 수 있습니다. 예를 들어

 

routes.MapRoute(
    name"Default",
    url"{controller}/{action}/{id}",
    defaultsnew { controller = "Home"action = "Index"id = UrlParameter.Optional }
);

 

기본 라우트 설정에 의해 id를 유동적으로 받을 수 있다면 컨트롤러에서는 id를 매개변수로 하여

 

public ActionResult Index(string id)
{
    ViewBag.id = id;

    return View();
}

 

필요한 값을 받아올 수 있게 됩니다.

 

public ActionResult Index(string id = "cliel")
{
    ViewBag.id = id;

    return View();
}

 

이 예제는 매개변수에 기본값을 지정하여 아무런 값이 전달되지 않았을때 대안을 마련한 것입니다. 참고로 값형식의 매개변수는 값이 반드시 존재해야 하지만 string이나 object와 같은 참조형식은 아무런 값이 없을때 null이 됩니다.

 

2. 액션 처리

 

액션 메서드에서는 필요에 따라 다른 경로로 리다이렉션을 하거나 특정한 부분뷰를 반환할 수 있습니다. 예를 들어

 

public ActionResult Index()
{
    return Redirect("/Home/MyPage");
}

 

사용자를 리다이렉션하려면 위와 같이 Redirect 메서드를 사용할 수 있습니다. 이외에도 사용자에게 다양한 뷰를 렌더하기 위한 다음 헬퍼메서드들이 존재합니다.

 

 View

 뷰를 렌더합니다.

 PartialView

 부분 뷰를 렌더합니다.

 Redirect

 특정 URL로 302 리다이렉션을 수행합니다.

 RedirectPermanent

 특정 URL로 301 리다이렉션을 수행합니다.

 RedirectToRoute

 라우트에 기반한 302 리다이렉션을 수행합니다.

 RedirectToRoutePermanent

 라우트에 기반한 301 리다이렉션을 수행합니다.

 RedirectToAction

 RedirectToRoute 의 래퍼버전

 RedirectToActionPermanent

 RedirectToRoutePermanent 의 래퍼버전

 HttpStatusCodeResult

 특정 HTTP 상태값을 반환합니다.

 File

 파일과 같은 이진데이터를 전송합니다.

 Json

 Json 형식의 데이터를 반환합니다.

 JavaScript

 JavaScript 코드를 반환합니다.

 None

 401 미인증 오류를 반환합니다.

 HttpNotFound

 404 찾을 수 없음 오류를 반환합니다.

 None

 매개변수에 특정 코드를 입력하면 코드에 해당하는 HTTP 코드를 반환하거나 아무런 동작도 수행하지 않습니다.

 

특히 View는 가장 자주 사용되는 메서드로서 아래와 같이 메서드만을 사용할 경우

 

public ActionResult Index()
{
    return View();
}

 

액션 메서드와 동일한 이름의 뷰를 렌더하거나

 

public ActionResult Index()
{
    return View("MyPage");
}

 

같은 컨트롤러안에 다른 뷰를 렌더할 수 있습니다.

 

public ActionResult Index()
{
    return RedirectToRoute(new { controller = "My"action = "MyPage" });
}

 

RedirectToRoute는 특정 컨트롤러나 뷰로의 리다이렉션을 수행합니다. 그런데 이 동작은 RedirectToAction을 통해서도 동일하게 수행할 수 있습니다.

 

public ActionResult Index()
{
    return RedirectToAction("MyPage");
}

 

같은 컨트롤러에 있는 MyPage로의 액션메서드로 리다이렉션을 수행합니다.

 

public ActionResult Index()
{
    return RedirectToAction("MyPage""My");
}

 

다른 컨트롤러의 액션메서드를 지정해야 한다면 두번째 매개변수로 컨트롤러를 지정합니다.

 

public ActionResult Index()
{
    return new HttpStatusCodeResult(404, "Page Not Found");
}

 

특정 HTTP 상태값을 전달하려면 HttpStatusCodeResult 메서드를 사용합니다. 하지만 이 메서드를 별도의 헬퍼메서드를 제공하지 않으므로 개체를 직접 생성해서 전달해야 합니다.

 

public ActionResult Index()
{
    return HttpNotFound();
}

 

같은 404 코드라면 HttpNotFound 메서드를 사용할 수 있습니다.

 

3. 데이터 전달

 

컨트롤러와 뷰사이에 데이터를 전달해야 하는 경우에는 일반적으로 ViewBag 개체를 사용합니다.

 

public ActionResult Index()
{
    ViewBag.name = "cliel";
    ViewBag.time = DateTime.Now;
    return View();
}

 

컨트롤러에서 ViewBag을 사용해 전달하고자 하는 데이터를 저장합니다. 이때 name 이나 time 속성은 임의로 지정이 가능하며

 

<body>

    <div>
        test
        @ViewBag.name 님 @ViewBag.time 에 로그인

    </div>
</body>

 

뷰에서는 컨트롤러와 마찬가지로 ViewBag의 속성을 통해 설정된 값을 가져올 수 있습니다.

 

만약 리다이렉션을 통하여 데이터를 전송해야 한다면 ViewBag만으로는 원하는바를 이루기가 힘들것입니다. 이때는 TempData 를 이용할 수 있습니다.

 

public ActionResult Index()
{
    TempData["name"] = "cliel";
    TempData["time"] = DateTime.Now;

    return RedirectToAction("MyPage""My");
}

 

TempData는 임의의 값을 위와 같이 설정하고

 

<body>

    <div>
        @TempData["name"] 님 @(((DateTime)TempData["time"]).Hour) 시에 접속
    </div>
</body>

 

뷰에서는 동일한 방법으로 값을 읽어올 수 있습니다. 주의해야할 점은 TempData는 기본적으로 값을 한번 읽으면 더이상 값을 보존하지 않고 삭제합니다. 따라서 한번 읽은 값은 다시 읽을 수 없습니다.

 

다만

 

@TempData.Peek("name") 님 @(((DateTime)TempData["time"]).Hour) 시에 접속

 

Peek 메서드를 통해 값을 읽으면 한번 더 데이터를 읽을 수 있도록 임시로 데이터를 보존할 수 있습니다.

 

4. 데이터 모델

 

뷰에 특정 모델에 대한 개체를 전달하려면 View메서드에 해당 개체를 지정하면 됩니다.

 

public ActionResult Index()
{
    var t = DateTime.Now;
    return View(t);
}

 

예제의 컨트롤러에서는 View에 현재시간을 개체로 하여 모델로 전달하고 있습니다.

 

<body>

     <div>
        현재는 : @(((DateTime)Model).Month) 월 입니다.
    </div>
</body>

 

뷰에서 모델을 받을때는 해당 형식으로 변환해 줘야 합니다. 왜냐하면 뷰에서 모델은 기본적으로 object형식이기 때문입니다.

 

혹은 뷰에서 미리 모델의 형식을 지정해 두면 뷰본문에서 모델의 형변환절차를 생략할 수 있습니다.

 

@model DateTime

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        현재는 : @Model.Month 월 입니다.
    </div>
</body>
</html>

 

5. 세션처리

 

[SessionState(System.Web.SessionState.SessionStateBehavior.Default)]
public class HomeController : Controller
{
    // GET: Home
    public ActionResult Index()
    {
        return View();
    }
}

 

SessionState 속성으로 SessionStateBehavior 열거형값을 설정하면 세션처리를 어떻게 할지 컨트롤러 범위에서 결정할 수 있습니다.

 

SessionStateBehavior 가 Default면 기본적인 세션처리를 의미하며 HttpContext에서 세션처리를 위임하게 됩니다. 반면 Required면 세션에 대한 읽기/쓰기가 가능하고 ReadOnly면 세션에 대해 읽기만 가능하도록 합니다. 마지막으로 Disabled면 세션을 사용하지 않도록 합니다.

 

세션처리가 중요한 이유는 성능에 영향을 미칠 수 있기 때문입니다. 가능하면 세션을 사용하지 않는것이 성능에 도움이 됩니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET MVC] Web API  (0) 2018.03.28
[ASP.NET MVC] 필터(Filter)  (0) 2018.03.20
[ASP.NET MVC] 컨트롤러(Controller)  (0) 2018.03.14
[C#] File / FileInfo  (0) 2018.03.07
[C#] Hashtable / SortedList  (0) 2018.02.27
[ASP.NET MVC] 라우팅(Routing)  (0) 2018.02.21
0 0