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개의 좋아요

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

2개의 좋아요

넵 의견 감사합니다

1개의 좋아요

@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개의 좋아요

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

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

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

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

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

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

4개의 좋아요

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

답변 달아주신대로 테스트를 해보았는데도 동일한 현상이 나타납니다.
아래와 같이 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개의 좋아요

저는 정상적으로 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개의 좋아요

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

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

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

1개의 좋아요