사용자 가입을 하는 Form의 경우에는 일반적인 Wizard Form을 취하게 된다. Wizard Form을 통해서, 사용자 정보 수집과 각 정보에 대한 Validation check를 하게 되는데, 이 때에 너무나 많은 질문으로 인하여 당황하지 않게 하는 점진적인 표현(progressive disclosure)이라는 사용자 원칙을 따른다. 모든 질문들은 전부 서로 관련이 있는 것이 아니므로 각 단계별로 소량의 질문들을 나타내는 것이다.
여러단계를 통한 이동을 하게 되는 경우, 고려되어야지 되는 것은 Next 를 통한 입력한 정보의 전달, 그리고 Back으로 돌아갔을 때 사용자의 정보의 유지가 필요하게 된다. 이를 Session으로 처리해주는 방법도 ASP .NET MVC에서는 TempData와 데이터 Serialization을 통해서 이를 쉽게 구현 가능하다.
먼저, 사용자 데이터를 LogFormatter로 Serialization시켜주기 위한 Help method와 사용자 데이터 class를 만들어준다.
그리고, Controller의 OnActionExecuting과 OnActionExecuted 함수를 다음과 같이 재 정의 한다. 이제 Controller의 모든 Action은 TempData를 검사하고, TempData에서 데이터가 있는 경우에는 Deserialization을 통해서 사용자 데이터를 가지고 온다.
View에서 LogFormatter를 이용해서 데이터의 ViewState를 적어준다.
이와 같이 구성 이후에, Html을 보면 색다른 결과가 나온다.
그것은 VIEWSTATE를 이용해서 Wizard Form을 구성했기 때문인데, VIEWSTATE는 ASP .NET WEBFORM기술에서 악명이 높은 기술이다. 그렇지만, 이와 같이 구성이 된다면 서버의 Session상태에 구애받지 않고, 만약에 사용자가 밤새 웹브라우저를 열어놓은 일이 있더라도 값을 보장받을 수 있는 강력한 방법이 된다.
단, 주의할점이 하나 있다. VIEWSTATE 값은 Base64로 Formatting된 값이다. 이 값의 변조는 악의적인 사용자가 가능한 정보이기 때문에, 특별한 Encoding을 통하던, 아니면 다른 방법을 통해서 암호화를 하는 것이 용의하다.
여러단계를 통한 이동을 하게 되는 경우, 고려되어야지 되는 것은 Next 를 통한 입력한 정보의 전달, 그리고 Back으로 돌아갔을 때 사용자의 정보의 유지가 필요하게 된다. 이를 Session으로 처리해주는 방법도 ASP .NET MVC에서는 TempData와 데이터 Serialization을 통해서 이를 쉽게 구현 가능하다.
먼저, 사용자 데이터를 LogFormatter로 Serialization시켜주기 위한 Help method와 사용자 데이터 class를 만들어준다.
01.
[Serializable]
02.
public
class
RegistrationData
03.
{
04.
public
string
Name {
get
;
set
; }
05.
public
string
Email {
get
;
set
; }
06.
public
int
? Age {
get
;
set
; }
07.
public
string
Hobbies {
get
;
set
; }
08.
}
09.
10.
public
static
class
SerializationUtils
11.
{
12.
public
static
string
Serialize(
object
obj)
13.
{
14.
using
(StringWriter sw =
new
StringWriter())
15.
{
16.
new
LosFormatter().Serialize(sw, obj);
17.
return
sw.ToString();
18.
}
19.
}
20.
21.
public
static
object
Deserialize(
string
data)
22.
{
23.
if
(data ==
null
)
24.
{
25.
return
null
;
26.
}
27.
else
28.
{
29.
return
(
new
LosFormatter()).Deserialize(data);
30.
}
31.
}
32.
}
그리고, Controller의 OnActionExecuting과 OnActionExecuted 함수를 다음과 같이 재 정의 한다. 이제 Controller의 모든 Action은 TempData를 검사하고, TempData에서 데이터가 있는 경우에는 Deserialization을 통해서 사용자 데이터를 가지고 온다.
01.
public
RegistrationData RegData {
get
;
set
; }
02.
03.
protected
override
void
OnActionExecuting(ActionExecutingContext filterContext)
04.
{
05.
//Action이 call 될 때, RegData 값을 update 시켜준다.
06.
RegData = (SerializationUtils.Deserialize(Request.Form[
"regData"
]) ?? TempData[
"regData"
] ??
07.
new
RegistrationData())
as
RegistrationData;
08.
TryUpdateModel<registrationdata>(RegData);
09.
}
10.
11.
protected
override
void
OnActionExecuted(ActionExecutedContext filterContext)
12.
{
13.
if
(filterContext.Result
is
RedirectToRouteResult)
14.
{
15.
//Back이나 Next로 RedirectToAction이 호출이 되었을때, TempData에 regData값을 넣어준다.
16.
TempData[
"regData"
] = RegData;
17.
}
18.
}
19.
</registrationdata>
View에서 LogFormatter를 이용해서 데이터의 ViewState를 적어준다.
01.
<
asp:content
id
=
"Content2"
contentplaceholderid
=
"MainContent"
runat
=
"server"
>
02.
<%using(Html.BeginForm()){ %>
03.
<%=Html.ValidationSummary() %>
04.
<%=Html.Hidden("regData", SerializationUtils.Serialize(Model)) %>
05.
<
p
>Name:<%=Html.TextBox("name") %></
p
>
06.
<
p
>E-Mail:<%=Html.TextBox("email")%></
p
>
07.
<
p
><
input
type
=
"submit"
name
=
"nextButton"
value
=
"Next"
></
p
>
08.
<%} %>
09.
</
asp:content
>
이와 같이 구성 이후에, Html을 보면 색다른 결과가 나온다.
1.
<
form
action
=
"/Registration/BasicDetails"
method
=
"post"
>
2.
<
input
id
=
"regData"
name
=
"regData"
type
=
"hidden"
value
=
"/wEy9wIAAQAAAP////8BAAAAAAAAAAwCAAAAQVdpemFyZEZvcm0sIFZlcnNpb249MS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAiV2l6YXJkRm9ybS5Nb2RlbHMuUmVnaXN0cmF0aW9uRGF0YQQAAAAVPE5hbWU+a19fQmFja2luZ0ZpZWxkFjxFbWFpbD5rX19CYWNraW5nRmllbGQUPEFnZT5rX19CYWNraW5nRmllbGQYPEhvYmJpZXM+a19fQmFja2luZ0ZpZWxkAQEDAW5TeXN0ZW0uTnVsbGFibGVgMVtbU3lzdGVtLkludDMyLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGAwAAAAnsnKTsmIHqtowGBAAAAAnsnbTrqZTsnbwKCgs="
>
3.
<
p
>Name:<
input
id
=
"name"
name
=
"name"
type
=
"text"
value
=
"윤영권"
></
p
>
4.
<
p
>E-Mail:<
input
id
=
"email"
name
=
"email"
type
=
"text"
value
=
"이메일"
></
p
>
5.
<
p
><
input
type
=
"submit"
name
=
"nextButton"
value
=
"Next"
></
p
>
6.
</
form
>
그것은 VIEWSTATE를 이용해서 Wizard Form을 구성했기 때문인데, VIEWSTATE는 ASP .NET WEBFORM기술에서 악명이 높은 기술이다. 그렇지만, 이와 같이 구성이 된다면 서버의 Session상태에 구애받지 않고, 만약에 사용자가 밤새 웹브라우저를 열어놓은 일이 있더라도 값을 보장받을 수 있는 강력한 방법이 된다.
단, 주의할점이 하나 있다. VIEWSTATE 값은 Base64로 Formatting된 값이다. 이 값의 변조는 악의적인 사용자가 가능한 정보이기 때문에, 특별한 Encoding을 통하던, 아니면 다른 방법을 통해서 암호화를 하는 것이 용의하다.