hidden값이 의도치 않게 바뀝니다.

안녕하세요 가입 후 첫 질문을 드립니다.

MVC패턴으로 개발을 하고 있습니다.
enum값으로 POST형식으로 파라미터를 전송하고 csthml의 hidden필드에 할당해서 값을 할당을했는데요. 의도치 않게 값이 다르게 할당되서 왜 그런지 알수 있나 해서 문의 드립니다.

// enum 값
public enum ServerControlOffType : int
{
    OFF,
    ON
}

// class
public class TestClass
{
  public int ControlType {get;set;}
}

// controller.cs
public async Task<IActionResult> SetControl(ServerControlOffType controlType)
{
var testClass = new TestClass(){ ControlType = (int)controlType };
....
return view(testClass);
}

// cshtml (일부러 3개 바인딩해봄)
@section HiddenFields {
    @Html.HiddenFor(m => m.ControlType)
    @Html.Hidden("ControlType", (int)Model.ControlType)
    <input type="hidden" name="ControlType" value="@Model.ControlType"/>
}

// 디버깅시 찍히는 값.
// 의도한 값은 1 맞습니다

// 웹화면에서 html 소스로 봤을경우

정리하자면
결국 POST전송시에는 enum값을 사용해서 전달을 하고서 int값으로 사용하려고 하는건데요,
의도치 않게 값이 바뀌게 되는데 혹시 아시는 고수분들 있으면 답변 부탁드립니다.

감사합니다.

1 Like

마크다운 사용법을 익히셔서, 다음부터는 소스코드를 작성해 주실 때 마크다운 소스코드 법으로 표기 부탁드립니다.

2 Likes

넵 의견 감사합니다

1 Like

@ssung 환영합니다.

좀 더 구체적으로 설명해주시겠어요? 1로 나와야 하는데 "ON"으로 나오는 것이 문제인건가요? 그리고 Markdown 문법으로 수정해드렸으니 한번 살펴봐주시기 바랍니다.

어제 문의를 하고 나서 테스트를 여러번 해보았는데 원인(?)을 찾긴했는데, 그 이유를 잘 모르겠네요…

// controller.cs
public async Task<IActionResult> SetControl(ServerControlOffType controlType)
{
var testClass = new TestClass(){ ControlType = (int)controlType };
....
return view(testClass);
}

//cshtml
@model TestClass
@section HiddenFields {
    @Html.HiddenFor(m => m.ControlType)
    @Html.Hidden("ControlType", (int)Model.ControlType)
    <input type="hidden" name="ControlType" value="@Model.ControlType"/>
}

POST전송시에 Controller에 controlType 라는 변수로 ServerControlOffType enum을 할당을 하고나서 TestClass 안의 ControlType 라는 변수에 int로 변환해서 저장해서 cshtml에서는 int형식의 값을 원하였는데 enum값(ON)으로 할당되서 왜 그런지 궁금합니다.

즉, 파라미터로 던진 변수는 controlType (맨 앞이 소문자), 모델값은 ControlType (맨앞이 대문자)

아 참고로 .NET6 MVC패턴으로 개발하고있습니다.

1 Like

razor - Html.Hidden 문법으로 html view를 바인딩 처리하면 모델 값이 ToString() 의 결과 값으로 바인딩 계산되기 때문 입니다.

이것은 wpf에서 바인딩에도 동일하게 처리 됩니다.

만약 Html.Hidden 에서 value를 enum 상수의 값을 int로 평가해서 바인딩 처리 하고 싶으시면

@Html.Hidden(“ControlType“, @(int)Model.ControlType)

razor 문법 안에서 직접 명시적으로 캐스팅 해보세요.

-* 폰으로 답변을 달아 마크다운 처리가 잘 안되네요 …

4 Likes

답변감사합니다. 답변확인이 늦었습니다.

답변 달아주신대로 테스트를 해보았는데도 동일한 현상이 나타납니다.
아래와 같이 3가지 방법으로 출력해보았습니다.

@section HiddenFields {
    
    @Html.HiddenFor(m => m.ControlType)
    @Html.Hidden("ControlType", (int)Model.ControlType)
    <input type="hidden" name="ControlType" value="@Model.ControlType" />
}
<input data-val="true" data-val-required="The ControlType field is required." id="ControlType" name="ControlType" type="hidden" value="ON">
<input id="ControlType" name="ControlType" type="hidden" value="ON">
<input type="hidden" name="ControlType" value="1">

1 Like

저는 정상적으로 int값이 나타납니다.

    <input data-val="true" data-val-required="The ControlType field is required." id="ControlType" name="ControlType" type="hidden" value="1" />
    <input id="ControlType" name="ControlType" type="hidden" value="1" />
    <input type="hidden" name="ControlType" value="1"/>

올려주신 코드를 이용했습니다.
.net 6.0 7.0으로 테스트해봤습니다.

다른 이유가 있을것 같은데 모르겠네요.
vscode로 mvc앱을 하나 생성해서 그대로 사용했습니다.

2 Likes

저도 .NET6으로 하고 있는데 다른문제가있나보네여 ㅠㅠ

파라미터 변수를 일단 모델하고 다르게 처리해서 처리하긴 했습니다.

답글 달아주신것처럼 저렇게 출력이 되어야하는데 의문이네요. ㅠㅠ
도움주셔서 감사합니다.

1 Like