Programming/.NET

보통 URL을 생성할때는 다음과 같이 하던게 일반적인 방법이었습니다.

 

<a href="/home/default.htm"></a>

 

그런데 ASP.NET MVC에서 URL을 생성할때는 URL을 생성하는 관련 메서드를 호출함으로서 이루어 집니다.

 

@Html.ActionLink("go""myPage")

 

가장 일반적으로는 @Html 의 ActionLink 헬퍼메서드를 사용하는 것입니다. 만약 이 메서드가 Home컨트롤러의 Index뷰에서 사용되었다면

 

<a href="/home/myPage">go</a>

 

위 형태의 링크를 생성할 것입니다. 이 방법이 사용되는 중요한 이유는 어떤 이유에 의해서 URL의 형태가 바뀌게 되면 사람이 직접 기존의 링크를 수정하지 않아도 해당 라우팅정보가 그대로 반영될 수 있기 때문입니다. 예를 들어 기존에 /Home/Index를 가리키던 라우팅정보가

 

routes.MapRoute("myRoute""myUrl/{action}"new { controller = "Home" });

 

이러한 라우트설정에 의해서 바뀌게 되면 ActionLink메서드는 바뀐 라우팅정보를 수용하여 다음처럼 링크경로를 변경하고 표시할 것입니다.

 

<a href="/myurl/myPage">go</a>

 

이와 같은 작동방식은 액션메서드의 속성에 라우트정보가 정의되어 있는 상태에서도

 

[Route("~/Default")]
public ActionResult MyPage()
{
    return View();
}

 

동일하게 라우팅정보를 적용시켜 아래와 같은 형태의 URL을 생성하게 됩니다.

 

<a href="/Default">go</a>

 

ActionLink 메서드는 기본적으로 현재의 컨트롤러내부를 가리키게 되는데 만약 다른 컨트롤러의 액션메서드를 호출하고자 한다면

 

@Html.ActionLink("go""myPage""myControl")

 

예제에서 처럼 직접 컨트롤러를 지정하면 됩니다.

 

<a href="/myControl/myPage">go</a>

 

컨트롤러와 액션이외에 특정 세그먼트와 값을 추가적으로 전달해야할 경우도 있는데 이럴때는 익명 형식을 통해 해당 세그먼트와 그 값을 정의해 두면 됩니다.

 

@Html.ActionLink("go""myPage"new { id = "cliel" })
<a href="/Home/myPage/cliel">go</a>

 

이렇게 처리될 수 있는 이유는 기본적으로 라우트정보가 설정되는 RouteConfig.cs 파일에 다음과 같이 라우트정보가 정의되어 있기 때문입니다.

 

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

 

만약 id 세그먼트에 대한 정의가 라우정보에 존재하지 않았을때 같은 방식으로 ActionLink 메서드를 사용하게 되면 id는 세그먼트가 아닌 단순한 get값을 추가해 줍니다.

 

<a href="/Home/myPage?id=cliel">go</a>

 

ActionLink는 단순히 우리가 필요한 링크를 만들 수 있을 뿐만 아니라 HTML표현에 필요한 여러가지 속성들을 설정할 수도 있습니다.

 

@Html.ActionLink("go""myPage"nullnew { id = "mylink"@class = "mystyle" })
<a class="mystyle" id="mylink" href="/Home/myPage">go</a>

 

익명형식으로 설정할 속성의 이름과 속성값을 지정하고 있는데 참고로 ASP.NET MVC에서는 C#에서 특정한 예약어를 사용해야할때 앞에 @문자를 붙여 쓸 수 있습니다. 예제에서 class의 속성을 설정하기 위해 @class로 표현한것은 바로 이때문입니다.

 

물론 이외에도 다음과 같이 필요한 모든 값을 ActionLink에 전달하면 링크가 생성되는 형태를 세부적으로 다룰 수 있습니다.

 

@Html.ActionLink("go""myPage""Home""https""www.naver.com""target"new { id = "cliel" } ,new { id = "mylink"@class = "mystyle" })
<a class="mystyle" id="mylink" href="https://www.naver.com/Home/myPage/cliel#target">go</a>

 

ActionLink 메서드와 비슷하게 Action 메서드도 존재하는데 이 메서드는 링크를 생성하는게 아닌 http://cliel.com/Home/Index 와 같은 단순한 문자열만을 생성합니다.

 

뿐만 아니라 URL은 특정 라우트를 대상으로 URL을 생성할 수도 있어서 예를 들어 RouteConfig.cs 파일에 기본적으로 다음과 같은 등록된 라우트정보가 있다면

 

@Html.RouteLink("go""Default"new { id = "cliel" })

 

위와 같이 라우트명을 지정해 URL을 해당 라우트를 기반으로 하여 생성할 수 있습니다.

 

/Home/Index/cliel

 

RouteLink 메서드에서는 별도의 컨트롤러와 메서드를 지정하지 않았지만 이는 라우트에 등록된 기본값으로 대체될 수 있고 id세그먼트는 지정된 값으로 대체될 수 있기 때문입니다.

 

이제 까지살펴본 ActionLink 메서드는 뷰에서 사용이 가능한 메서드인데 때로는 컨트롤러내부에서 URL을 생성해야할 필요가 있습니다. 이럴때는 Url 객체의 Action 과 RouteUrl 메서드를 사용할 수 있습니다.

 

string url = Url.Action("Index""Home"new { id = "cliel" });

 

우선 Action 메서드는 ActionLink 메서드와 사용법이 완벽히 일치하므로 별다른 설명이 필요없을 것입니다.

 

string url = Url.RouteUrl(new { controller = "Home"action = "MyPage" });

 

RouteUrl 메서드는 RouteConfig.cs 에서 라우트를 설정할때와 비슷한 개념과 방식으로 URL을 생성할 수 있습니다.

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

Debug / Release  (0) 2019.01.15
[ASP.NET MVC] Razor  (0) 2019.01.08
[ASP.NET MVC] URL 다루기  (0) 2018.12.18
[C#] 비트(bit) 연산자  (0) 2018.11.20
[ASP.NET MVC] 액션 메서드(Action Method)  (0) 2018.11.13
[C#] Thread  (0) 2018.11.06
0 0