문제

주의 :이 질문은 9 년이 넘었습니다!

최선의 선택은 새로운 질문을 검색하거나 아래의 답변을 검색하는 것입니다.

버전에 맞는 답변이있는 경우 답변에 사용중인 MVC 버전이 포함되어 있는지 확인하십시오.
(원래 질문은 아래에서 시작됩니다)


이것은 나에게 약간 기괴한 것처럼 보이지만, 내가 알 수있는 한, 이것이 당신이하는 방법입니다.

나는 객체 모음이 있으며, 사용자가 하나 이상의 객체를 선택하기를 원합니다. 이것은 나에게 "확인란과 함께 양식"이라고 말합니다. 내 객체에는 "선택된"개념이 없습니다 (WCF 호출을 제외하고 기초적인 POCO가 형성됨). 그래서 나는 다음을 수행합니다.

public class SampleObject{
  public Guid Id {get;set;}
  public string Name {get;set;}
}

관점에서 :

<%
    using (Html.BeginForm())
    {
%>
  <%foreach (var o in ViewData.Model) {%>
    <%=Html.CheckBox(o.Id)%>&nbsp;<%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

그리고 컨트롤러에서 이것은 사용자가 확인한 객체를 파악할 수있는 유일한 방법입니다.

public ActionResult ThisLooksWeird(FormCollection result)
{
  var winnars = from x in result.AllKeys
          where result[x] != "false"
          select x;
  // yadda
}

처음에는 그 점이 있고, 둘째, 사용자가 확인한 항목에 대해 FormCollection은 그 값을 그 값보다는 "진정한 거짓"으로 나열합니다.

분명히, 나는 뭔가를 놓치고 있습니다. 나는 이것이 HTML 양식 내에서 작동하는 컬렉션의 개체가 UpdateModel() 또는 ModelBinder를 통해.

그러나 내 객체는 이것을 위해 설정되지 않았습니다. 이것이 이것이 유일한 방법이라는 것을 의미합니까? 그것을하는 또 다른 방법이 있습니까?

도움이 되었습니까?

해결책

html.checkbox가 이상한 일을하고 있습니다 - 결과 페이지에서 소스를 보면 <input type="hidden" /> 각 체크 박스와 함께 생성되며 각 양식 요소에 대해보고있는 "진정한 잘못된"값을 설명합니다.

방금 시도했기 때문에 ASP.NET MVC 베타에서 확실히 작동하는이 작업을 시도하십시오.

html.checkbox ()를 사용하는 대신보기에 이것을 넣으십시오.

<% using (Html.BeginForm("ShowData", "Home")) {  %>
  <% foreach (var o in ViewData.Model) { %>
    <input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
    <%= o.Name %>
  <%}%>
  <input type="submit" value="Submit" />
<%}%>

확인란이 모두 호출됩니다 selectedObjects, 그리고 value 각 확인란의 해당 객체의 안내서입니다.

그런 다음 다음 컨트롤러 조치에 게시하거나 응답 대신 유용한 일을하는 유사한 것.

public ActionResult ShowData(Guid[] selectedObjects) {
    foreach (Guid guid in selectedObjects) {
        Response.Write(guid.ToString());
    }
    Response.End();
    return (new EmptyResult());
}

이 예제는 확인한 상자의 안내를 작성합니다. ASP.NET MVC는 선택한 확인란의 안내 값을 Guid[] selectedObjects 당신을위한 매개 변수, 심지어 요청. 형식의 컬렉션에서 instantied guid 객체로 문자열을 구문 분석합니다.

다른 팁

htmlhelper는 숨겨진 입력을 추가하여 컨트롤러에 확인되지 않은 상태에 대해 알립니다. 따라서 올바른 점검 상태를 갖기 위해 :

bool bChecked = form[key].Contains("true");

그들이 왜 확인란과 같은 이름의 숨겨진 필드를 넣는 지 궁금한 경우 그 이유는 다음과 같습니다.

sourcecode mvcbetasource mvc src mvcfutures mvc 의 의견ButtonsAndlinKextensions.cs

추가 렌더링 <input type="hidden".../> 확인란의 경우. 이는 확인되지 않은 확인란이 요청에 전송되지 않는 시나리오를 다룹니다. 숨겨진 입력을 보내면 요청이 제출 될 때 확인란이 페이지에 있음을 알 수 있습니다.

무대 뒤에서 컨트롤러 동작 방법의 매개 변수에 바인딩하기 위해 이것을 알아야한다고 생각합니다. 그런 다음 내가 생각하는 트라이-스테이트 부울을 가질 수 있습니다 (무효가 가능한 부울 매개 변수에 바인딩). 나는 그것을 시도하지 않았지만 그것이 그들이 한 일을 바라고 있습니다.

당신은 또한 사용해야합니다 <label for="checkbox1">Checkbox 1</label> 그렇다면 사람들은 레이블 텍스트와 확인란 자체를 클릭 할 수 있기 때문입니다. 또한 스타일이 쉽고 적어도 페이지의 컨트롤을 통해 탭하면 강조 표시됩니다.

<%= Html.CheckBox("cbNewColors", true) %><label for="cbNewColors">New colors</label>

이것은 단지 '오, 내가 할 수있다'는 것이 아닙니다. 중요한 사용자 경험 향상입니다. 모든 사용자가 알지 못하더라도 많은 Will 라벨을 클릭 할 수 있습니다.

이 답변 중 어느 것도이를 위해 내장 된 MVC 기능을 사용하지 않았다는 사실에 놀랐습니다.

나는 이것에 대한 블로그 게시물을 썼습니다 여기, 실제로 레이블을 확인란에 연결합니다. 나는 그것을 사용했다 editortemplate 깨끗하고 모듈 식으로이를 달성하는 폴더.

EditortemPlate 폴더의 새 파일이 다음과 같이 보입니다.

@model SampleObject

@Html.CheckBoxFor(m => m.IsChecked)
@Html.HiddenFor(m => m.Id)
@Html.LabelFor(m => m.IsChecked, Model.Id)

실제 관점에서, 단순히 1 줄의 코드 라인을 반복 할 필요가 없습니다.

@Html.EditorFor(x => ViewData.Model)

내 방문 블로그 게시물 자세한 사항은.

여기 내가 한 일이 있습니다.

보다:


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

제어 장치:


var checkBox = Request.Form["applyChanges"];

if (checkBox == "on")
{
...
}

나는 HTML을 발견했다.* 도우미 방법은 어떤 경우에는 유용하지 않으며, 평범한 오래된 HTML에서 그것을하는 것이 더 좋았다. 이것은 그들 중 하나이며, 다른 하나는 라디오 버튼입니다.

편집 : 이것은 미리보기 5에 있습니다. 분명히 버전 간 YMMV.

그들은 첫 번째 값 만 읽기로 선택한 것으로 보이므로 확인란을 확인할 때 "true"이고 숨겨진 값 만 포함 된 경우 "false"입니다. 이것은 다음과 같은 코드로 쉽게 가져옵니다.

model.Property = collection["ElementId"].ToLower().StartsWith("true");

@Dylan Beattie Great Find !!! 감사합니다. 더욱 확장하기 위해이 기술은 뷰 모델 접근 방식과 완벽하게 작동합니다. MVC는 너무 멋져서 뷰에 바인딩 된 모델 객체의 동일한 이름에 따라 다양한 가이드 배열을 속성에 바인딩 할 수있을만큼 똑똑합니다. 예시:

ViewModel :

public class SampleViewModel
{
    public IList<SampleObject> SampleObjectList { get; set; }
    public Guid[] SelectedObjectIds { get; set; }

    public class SampleObject
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }
}

보다:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Sample View</h2>
<table>
    <thead> 
        <tr>
            <th>Checked</th>
            <th>Object Name</th>
        </tr>
    </thead> 
<% using (Html.BeginForm()) %>
<%{%>                    
    <tbody>
        <% foreach (var item in Model.SampleObjectList)
           { %>
            <tr>
                <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
                <td><%= Html.Encode(item.Name)%></td>
            </tr>
        <% } %>
    </tbody>
</table>
<input type="submit" value="Submit" />
<%}%>                    

제어 장치:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult SampleView(Guid id)
    {
        //Object to pass any input objects to the View Model Builder 
        BuilderIO viewModelBuilderInput = new BuilderIO();

        //The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
        SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);

        return View("SampleView", viewModel);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SampleView(SampleViewModel viewModel)
    {
        // The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
        return View();
    }

View Model Philosophy에 익숙한 사람이라면 누구나 기뻐할 것입니다. 이것은 챔피언처럼 작동합니다!

또한 각 확인란의 이름을 다른 이름으로 지정하고 해당 이름이 ActionResults 매개 변수의 일부를 가지고 있음을 지적하고 싶습니다.

예시,

보다:

 <%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232

 <%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422

제어 장치:

public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
    ...
}

이름이 동일하기 때문에보기의 값은 동작으로 전달됩니다.

이 솔루션이 귀하의 프로젝트에 이상적이지 않다는 것을 알고 있지만 아이디어를 버릴 것이라고 생각했습니다.

<input type = "checkbox" name = "checkbox1" /> <label> Check to say hi.</label>

컨트롤러에서 :

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection fc)
    {

         var s = fc["checkbox1"];

         if (s == "on")
         {
             string x = "Hi";
         }
    }

이 문제는 릴리스 1.0에서도 발생합니다. html.checkbox ()는 원래 확인란과 동일한 이름/ID로 다른 숨겨진 필드를 추가하게합니다. 그리고 document.getElemtentsByName ()을 사용하여 확인란 배열을로드하려고하면서 상황이 엉망인 방법을 추측 할 수 있습니다. 기괴한 것입니다.

내가 수집 할 수있는 것에서, 모델은 checked = true 또는 false인지 추측하고 싶지 않습니다. 나는 다음과 같은 양식을 제출하기 전에 Checkbox 요소에 jQuery로 값 속성을 설정하여이 문제를 해결했습니다.

 $('input[type="checkbox"]').each(function () {
       $(this).attr('value', $(this).is(':checked'));
 }); 

이렇게하면 확인란의 값을 저장하기 위해 숨겨진 요소가 필요하지 않습니다.

이 질문은 MVC3이 나오지 않았을 때 작성되었지만이 질문에 와서 MVC3을 사용하는 사람에게는 "올바른"방법을 원할 수 있습니다.

나는 그것이 전체를하고 있다고 생각합니다

Contains("true");

물건은 훌륭하고 깨끗하며 모든 MVC 버전에서 작동합니다. 문제는 문화를 고려하지 않는다는 것입니다 (부울의 경우 실제로 중요하는 것처럼).

적어도 MVC3에서 BOOL의 가치를 파악하는 "올바른"방법은 ValueProvider를 사용하는 것입니다.

var value = (bool)ValueProvider.GetValue("key").ConvertTo(typeof(bool));

권한을 편집 할 때 고객의 사이트 중 하나 에서이 작업을 수행합니다.

var allPermissionsBase = Request.Params.AllKeys.Where(x => x.Contains("permission_")).ToList();
var allPermissions = new List<KeyValuePair<int, bool>>();

foreach (var key in allPermissionsBase)
{
     // Try to parse the key as int
     int keyAsInt;
     int.TryParse(key.Replace("permission_", ""), out keyAsInt);

     // Try to get the value as bool
     var value = (bool)ValueProvider.GetValue(key).ConvertTo(typeof(bool));
}

이제 이것의 아름다움은 거의 간단한 유형으로 이것을 사용할 수 있으며 문화에 따라 정확할 것입니다 (돈, 귀족 등).

ValueProvider는 다음과 같은 행동을 형성 할 때 사용되는 것입니다.

public ActionResult UpdatePermissions(bool permission_1, bool permission_2)

그러나이 목록을 동적으로 빌드하고 값을 확인하려고 할 때 컴파일 시간에 ID를 알지 못하므로 즉시 처리해야합니다.

가장 쉬운 방법은 그렇게 ...

당신은 이름과 가치를 설정합니다.

<input type="checkbox" name="selectedProducts" value="@item.ProductId" />@item.Name

그런 다음 제출시 확인란의 값을 잡고 INT 배열에 저장하십시오. 그런 다음 적절한 LINQ 기능. 그게 다 ..

[HttpPost]
        public ActionResult Checkbox(int[] selectedObjects)
        {
            var selected = from x in selectedObjects
                           from y in db
                           where y.ObjectId == x
                           select y;                   

            return View(selected);
        }

NAUTIC20의 답변과 마찬가지로 ViewModel에서 String/int/enum의 수집 속성과 동일한 이름의 MVC 기본 모델 바인딩 체크 박스 목록을 사용하십시오. 그게 다야.

그러나 한 가지 문제가 지적되어야합니다. 각 Checkbox 구성 요소에서 MVC 모델 바인딩에 영향을 미치는 "ID"를 넣지 않아야합니다.

다음 코드는 모델 바인딩을 위해 작동합니다.

 <% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
 <% } %>

다음 코드는 모델에 바인딩되지 않습니다 (차이는 각 확인란에 할당 된 ID입니다)

<% foreach (var item in Model.SampleObjectList)
       { %>
        <tr>
            <td><input type="checkbox" name="SelectedObjectIds" id="[some unique key]" value="<%= item.Id%>" /></td>
            <td><%= Html.Encode(item.Name)%></td>
        </tr>
<% } %>

이것이 html.checkbox를 사용할 때 이중 값을 풀기 위해 한 일입니다 (...

Replace("true,false","true").Split(',')

4 개의 상자를 확인하고 확인되지 않은 상태에서 확인하지 않고 확인한 상태에서 확인을 확인하면 True, False, False, False, True, False, True, False, True가 확인됩니다. 내가 필요한 것

이런 식은 어때?

bool isChecked = false;
if (Boolean.TryParse(Request.Form.GetValues(”chkHuman”)[0], out isChecked) == false)
    ModelState.AddModelError(”chkHuman”, “Nice try.”);

CheckBox htmlHelper를 사용할 때 게시 된 확인란 양식 데이터를 배열로 작업하는 것이 좋습니다. 나는 왜 그런지 잘 모르겠지만, 다른 방법이 작동한다는 것을 알고 있지만, 나는 단지 쉼표로 분리 된 문자열을 가능한 한 배열로 취급하는 것을 선호한다고 생각합니다.

따라서 '점검'또는 실제 테스트를 수행하는 것입니다.

//looking for [true],[false]
bool isChecked = form.GetValues(key).Contains("true"); 

허위 확인을하는 것은 다음과 같습니다.

//looking for [false],[false] or [false]
bool isNotChecked = !form.GetValues(key).Contains("true"); 

주요 차이점은 사용하는 것입니다 GetValues 이것은 배열로 돌아갑니다.

그냥이 일을하십시오 $(document).ready :

$('input:hidden').each(function(el) {
    var that = $(this)[0];
    if(that.id.length < 1 ) {

        console.log(that.id);
        that.parentElement.removeChild(that);

    }
});

내 해결책은 다음과 같습니다.

<input type="checkbox"  id="IsNew-checkbox"  checked="checked" />     
<input type="hidden"  id="IsNew" name="IsNew" value="true"  />      
<script language="javascript" type="text/javascript" >     
  $('#IsNew-checkbox').click(function () {    
      if ($('#IsNew-checkbox').is(':checked')) {    
          $('#IsNew').val('true');    
      } else {    
          $('#IsNew').val('false');    
       }    
  });   
</script>  

여기에서 찾을 수 있습니다.http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-assolution-of-string-bas-balid-boolean/---a-valid-boolean/

나는 거의 같은 문제가 있었지만 컨트롤러의 반환 값은 다른 값으로 차단되었습니다.

간단한 솔루션을 찾았지만 조금 거칠게 보입니다.

입력하십시오 Viewbag. 컨트롤러에서 이제는 다음과 같은 이름을 부여합니다. Viewbag.Checkbool

이제보기로 전환하고 이것을 시도하십시오 @Viewbag.Checkbool 이를 통해 컨트롤러에서 값을 얻을 수 있습니다.

내 컨트롤러 매개 변수는 다음과 같습니다.

public ActionResult Anzeigen(int productid = 90, bool islive = true)

내 확인란은 다음과 같이 업데이트됩니다.

<input id="isLive" type="checkbox" checked="@ViewBag.Value" ONCLICK="window.location.href = '/MixCategory/Anzeigen?isLive=' + isLive.checked.toString()" />

@mmacaulay를 사용하여 Bool을 위해 이것을 생각해 냈습니다.

// MVC Work around for checkboxes.
bool active = (Request.Form["active"] == "on");

checked active = true

확인되지 않은 Active = False

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top