ASP.NET MVC 4에서 확인란 값 가져 오기


122

ASP.NET MVC 4 앱에서 작업하고 있습니다. 이 앱에는 기본 형식이 있습니다. 내 양식의 모델은 다음과 같습니다.

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

내 양식에는 다음 HTML이 있습니다.

<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember">&nbsp;Remember Me?</label>

양식을 게시 할 때 모델의 Remember 값은 항상 false입니다. 그러나 모델의 Name 속성에는 값이 있습니다. 다음에서 중단 점을 설정하여이를 테스트했습니다.

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

나는 그것을 이해할 수 없다. 체크 박스 값이 설정되지 않는 이유는 무엇입니까?


적절한 값으로 게시됩니까? 피들러를 사용하여 확인할 수 있습니까? 또한 확인란의 값이 bool로 변환되는지 여부와 방법을 모르겠습니다.
shahkalpesh 2013

이것은 양식에 "on"또는 "off"로 게시됩니다. 이것은 분명히 바인딩되지 않습니다. 이것을 피하기 위해 어리석은 열거 형을 만들었습니다.
Yablargo

@Yablargo, 열거 형이 필요하지 않습니다. 입력 태그에 value = "true"를 추가하기 만하면됩니다. 그리고 아래와 같이 value = "false"로 숨김을 사용합니다.
sympatric greg는

답변:


213
@Html.EditorFor(x => x.Remember)

다음을 생성합니다.

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />

작동 원리 :

  • checkbox선택되지 않은 경우 양식은 hidden값 (false) 만 제출합니다.
  • 선택하면 양식 true은 모델 bool속성에 대한 두 개의 필드 (false 및 true)와 MVC 세트 를 제출 합니다.

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

선택하면 항상 기본값을 보냅니다.


7
안녕하세요,이 행동으로 인해 [true, false]를 단일 부울 값으로 바꾸는 방법을 알아낼 수없는 것 같기 때문에 모델이 유효성 검사에 실패합니다. 이 문제를 어떻게 해결합니까?
Obi

@ObiOnuorah 어떤 구조를 사용하고 있습니까? 도우미 또는 하드 코딩 된 HTML 마크 업?
webdeveloper

5
Html.EditorFor 또는 Html.CheckBoxFor 중 같은 결과 제공
오비

3
formCollection을 사용하는 경우 결과로 확인란에 대해 반환되는 문자열은 "true, false"입니다. 이것을 어떻게 파싱합니까? Replace ()가 유일한 옵션입니까?
Jo Smo

7
자체 체크 박스를 수동으로 추가하는 경우 핵심 부분은 해당 "true" 로 설정되어야한다는 것입니다 . 그렇지 않으면 양식에서 반환 된 기본값"on"이 되고 "on"은 bool에 바인딩 될 수 없습니다. 참 / 거짓이 필요합니다. ( "on"값이 필드에 유효하지 않다는 유효성 검사 오류가 표시 될 수 있습니다 .)
Greg

69

Model.Name을 사용하여 값을 설정하기 때문입니다. 빈 뷰 모델을 뷰에 전달한다고 가정합니다.

따라서 Remember의 값은 false이고 확인란 요소의 값을 false로 설정합니다. 즉, 확인란을 선택하면 양식에 "false"값이 게시됩니다. 선택하지 않으면 게시되지 않으므로 모델은 기본적으로 false로 설정됩니다. 그렇기 때문에 두 경우 모두 거짓 값이 표시됩니다.

선택 상자를 선택한 경우에만 값이 전달됩니다. Mvc에서 확인란을 사용하려면

@Html.CheckBoxFor(x => x.Remember)

또는 모델을 뷰에 바인딩하지 않으려는 경우.

@Html.CheckBox("Remember")

Mvc는 선택되지 않은 값을 유지하기 위해 숨겨진 필드를 사용하여 몇 가지 마법을 수행합니다.

편집하는 것을 정말로 싫어하고 요소를 직접 생성하고 싶다면 그렇게 할 수 있습니다.

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />

2
@Html.CheckboxFor코드는 실제로해야@Html.CheckBoxFor
fujiiface

@(Model.Remember ? "checked=\"checked\"" : "")라디오 버튼에서 어떻게 사용 하시겠습니까? 또는 가능한이 아니다
이지

이 옵션을 사용하면 HTML을 직접 조작하고 라디오 버튼은이며 type="radio"HTML에서 선택하려는 버튼을 선택하는 것은 위와 동일 checked="checked"합니다. 차이점 <input />은 동일한 이름을 가진 여러 요소 가 있다는 것 입니다. 추가 HTML을 적용 할 이들 중 하나를 결정해야합니다.
Dan Saltmer

@Html.CheckBoxFor(x => x.Remember)이것은 나를 위해 일한
JustLearning

15

이것 만 사용

$("input[type=checkbox]").change(function () {
    if ($(this).prop("checked")) {
        $(this).val(true);
    } else {
        $(this).val(false);
    }
});

또는 :$(this).val($(this).is(":checked"));
Norman

5

대신에

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

사용하다:

 @Html.EditorFor(x => x.Remember)

특히 Remember에 대한 확인란이 제공됩니다.


4

네, 체크 박스가 좀 이상합니다. Html 도우미를 사용하면 마크 업에 두 개의 체크 박스 입력이 생성되며, 체크되면 둘 다 IEnumerable의 이름-값 쌍으로 전달됩니다.

마크 업에서 체크하지 않으면 false 값을 가진 숨겨진 입력으로 만 전달됩니다.

예를 들어 마크 업에 다음이 있습니다.

      @Html.CheckBox("Chbxs") 

그리고 컨트롤러 작업에서 (이름이 컨트롤러의 확인란 매개 변수 이름과 일치하는지 확인하십시오) :

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

그런 다음 컨트롤러에서 다음과 같은 작업을 수행 할 수 있습니다.

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

나는 이것이 우아한 해결책이 아니라는 것을 알고 있습니다. 여기 누군가가 몇 가지 지침을 줄 수 있기를 바랍니다.


3

폼의 확인란에서 반환 된 값을 부울 속성으로 변환하기 위해 사용자 지정 ModelBinder의 빌드 변환기에서 ValueProviderResult를 사용했습니다.

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));

3

모델이 아닌 FormCollection으로 작업하는 경우 할당은 다음과 같이 간단 할 수 있습니다.

MyModel.Remember = fields["Remember"] != "false";

2

비슷한 문제가 발생하여 확인란, hiddenfor 및 작은 JQuery를 사용하여 확인란 값을 다시 가져올 수있었습니다.

@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)

<script>

    $("#isPreferred").change(function () {

        $("#IsPreferred").val($("#isPreferred").val());

    })

</script>

2

이것은 큰 고통이었고 더 간단해야 할 것 같습니다. 여기 내 설정 및 솔루션이 있습니다.

다음 HTML 도우미를 사용하고 있습니다.

@Html.CheckBoxFor(model => model.ActiveFlag)

그런 다음 컨트롤러에서 양식 수집 및 그에 따라 처리를 확인합니다.

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;

동의 user.IsActive = fc["IsActive"] != "false";했습니다. 문자열 비교를 수행하는 데 여전히 더러움을 느끼기 때문에 이것을 더 짧게 만들었 습니다.
WildJoe

1

나는 방금 이것을 만났다 (나는 그것이 on / off가되지 않는다는 것을 믿을 수 없다!)

어쨌든!

<input type="checkbox" name="checked" />

"on"또는 "off"값을 게시합니다.

WONT 는 부울에 바인딩되지만이 어리석은 해결 방법을 수행 할 수 있습니다!

 public class MyViewModel
 {
     /// <summary>
     /// This is a really dumb hack, because the form post sends "on" / "off"
     /// </summary>                    
     public enum Checkbox
     {
        on = 1,
        off = 0
     }
     public string Name { get; set; }
     public Checkbox Checked { get; set; }
}

1
@Html.EditorFor(x => x.ShowComment)


$(function () {
        // set default value to control on document ready instead of 'on'/'off' 
        $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
    });

    $("#ShowComment").change(function() {
        // this block sets value to checkbox control for "true" / "false"

        var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
        if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
        else $("input[type='checkbox'][name='ShowComment']").val(false);

    });

3
안녕하세요 Surendran과 Stack Overflow에 오신 것을 환영합니다. 코드를 포함 할 때는 가독성을 위해 형식을 지정하십시오. 그러나 더 중요한 것은 포함 된 코드가 OP의 질문을 해결하는 이유를 설명하는 것이 중요하다는 것입니다.
Alex A.

1

모델을 사용하는 MVC의 경우. 모델:

public class UserInfo
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

HTML :

<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>

[HttpPost] 함수에서 속성을 얻을 수 있습니다.

[HttpPost]
public ActionResult Login(UserInfo user)
{
   //...
   return View(user);
}

1

어떤 이유로 든 기본 제공 HtmlHelper 확장이 아닌 일반 HTML을 사용하려는 경우이 방법을 사용할 수 있습니다.

대신에

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

사용해보십시오

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />

HTML의 확인란 입력은 선택되면 값을 전송하고 선택되지 않은 경우에는 아무것도 전송하지 않습니다 (이로 인해 ASP.NET MVC가 기본값으로 대체됩니다. 필드, false). 또한 HTML의 체크 박스 값은 참 / 거짓이 아닌 어떤 것이 든 될 수 있습니다. 그래서 정말로 원한다면 모델의 문자열 필드에 체크 박스를 사용할 수도 있습니다.

built-in을 사용하는 경우 Html.RenderCheckbox실제로 두 가지 입력, 즉 확인란과 숨겨진 필드를 출력하므로 확인란이 선택 취소 된 경우 (아무것도 아님) 거짓 값이 전송됩니다. 이로 인해 다음과 같은 예기치 않은 상황이 발생할 수 있습니다.


0

같은 이름의 체크 박스가 여러 개인 경우 ... 불필요한 false를 제거하는 코드 :

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);

함수

public class form_checkbox
{

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
    {
        List<string> d_taxe1_list = new List<string>(val);

        int y = 0;

        foreach (string cbox in val)
        {

            if (val[y] == "false")
            {
                if (y > 0)
                {
                    if (val[y - 1] == "true")
                    {
                        d_taxe1_list[y] = "remove";
                    }
                }

            }

            y++;
        }

        val = new List<string>(d_taxe1_list);

        foreach (var del in d_taxe1_list)
            if (del == "remove") val.Remove(del);

        return val;

    }      



}

그걸 써 :

int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}

0
public ActionResult Index(string username, string password, string rememberMe)
{
   if (!string.IsNullOrEmpty(username))
   {
      bool remember = bool.Parse(rememberMe);
      //...
   }
   return View();
}

0

수정하기

public class MyModel
{
    public string Name { get; set; }
    public bool? Remember { get; set; }
}

컨트롤러에서 nullable bool을 사용하고 이와 같이 null에서 false로 폴백하십시오.

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    model.Remember = model.Remember ?? false;
    Console.WriteLine(model.Remember.ToString());
}

0

제 경우에는 get 메서드에서 모델 속성 "Remember"를 설정하지 않았습니다. 컨트롤러에서 로직을 확인하십시오. 당신도 똑같이 할 수 있습니다. 도움이 되었기를 바랍니다.


0

나는 다른 답변을 읽었지만 제대로 작동하지 못했습니다. 그래서 여기에 내가 얻은 해결책이 있습니다.

내 양식은를 사용하여 Html.EditorFor(e => e.Property)확인란을 생성하고 FormCollection컨트롤러에서 사용 하면 컨트롤러의 문자열 값을 전달합니다 'true,false'.

결과를 처리 할 때 루프를 사용하여 순환합니다. 또한 InfoProperty인스턴스를 사용 하여 양식에서 평가되는 현재 모델 값을 나타냅니다.

대신 반환 된 문자열이 단어로 시작하는지 확인한 'true'다음 부울 변수를 설정 true하여 반환 모델에 전달합니다.

if (KeyName.EndsWith("OnOff"))
{
    // set on/off flags value to the model instance
    bool keyTrueFalse = false;
    if(values[KeyName].StartsWith("true"))
    {
        keyTrueFalse = true;
    }
    infoProperty.SetValue(processedInfo, keyTrueFalse);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.