2014년 8월 20일 수요일

C# 에서 ASP 에서와 같이 <%=%> 로 서버 변수값을 지정하기.

ASP 에서는 html 영역에 <%=%> 태그를 이용해 직접 서버 사이드 변수를 html 태그에 포함 시킬수 있다.

하지만, C# 에선?

cs 단에 있는 변수의 값을 써봐야 오류만 뜬다.

사실 해결책은 간단한데....
그냥 변수를 public 으로 선언하고 쓰면 된다.
그러면 <%=printTitle%> 이런식으로 쓸수가 있다.

하지만, 이것도 문제가 있는 것이, postback 이 일어나면 변수가 초기화 되어 버리는 문제가 있다.

그래서 일반적으로는 ViewState 에 저장하고 사용한다.


public string UserName
    {
        set { ViewState["userName"] = value; }
        get
        {
            try { return ViewState["userName"].ToString(); }
            catch { return "사용자"; }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        UserName = "관리자";
    }


이렇게 ViewState 에 저장해 놓으면 html 단에서 <%=UserName%> 이렇게 써도 된다.

... 하지만...

만약 이렇게 ViewState 에 저장하기가 귀찮다면?

크게 2가지 방법이 있는데, 첫번째는 postback 때문에 문제가 생기지 않도록 알아서 잘 만드는거고...
page_Load() 에서 계속 값을 입력해 준다던지...

두번째는 <Literal /> 태그를 이용하는 방법이 있다.
<Literal> 태그는 말그대로 "문자 그대로의", "직역" 이라는 뜻 답게, 그냥 그대로 지정된 문자열을 표현해 준다.

쉽게 말해 <label:asp> 태그 같은 다른 태그들은 Html 로 파싱될때 <span>, <div>, <input> 같은 대응 되는 Html 태그들로 변화 되지만, <Literal> 태그는 지정한 값을 그대로 문자열로 Html 상에 표시한다.
그렇기 때문에 원하는 위치에 <Literal:asp runat="server" id="setVal" /> 이런식으로 쓰고 서버 단에서 setVal = "XXX"; 이런식으로 쓰면 <Literal> 태그 자리에 "XXX" 라는 문자열이 그대로 찍히게 된다.

그리고 .Net 태그 이기 때문에 자동으로 ViewState 에 저장되므로, 별도로 초기화라도 하지 않는 이상 Postback 이 일어나도 값이 그대로 유지된다.


말하자면, 어차피 서버사이드 태그들은 자동으로 ViewState 에 저장되니, 사실상 처음에 소개한 방법과 거의 차이가 없는 셈이다.
단지, 직접 변수를 선언해 쓰느냐, 제공해 준 태그를 쓰느냐 하는 차이 정도 뿐.

사실 쓰기에는 <Literal> 을 쓰는게 더 편리하지만, 가독성 측면에는 변수를 지정해 쓰는게 좀더 낫다.
예를 들자면.

<input Type="Text" value="<Literal:asp runat="server" id="setVal" />">
보다는

<input Type="Text" value="<%=setVal%>">

가 더 알아보기 쉬우니까.
게다가 한군데가 아닌 여러군데 사용되는 값의 경우라면 Public 변수를 쓰는것이 낫다.

물론 둘다 동작하는 코드 이니, 편한쪽을 쓰면된다.