2013-10-31 6 views
1

체크 박스를 클릭하면 다른 값을 전달하고 싶습니다. 내 코드체크 박스를 클릭하면 다른 값을 건네줍니다.

foreach (var item in Model) { 

       <td> 
        @Html.CheckBox("Project", false, new { item.ProjectId}) 
       </td> 
} 

컨트롤러 다음과 같습니다

 [HttpPost] 
     public ActionResult Test(FormCollection collection) 
     { 
      var test = collection["Project"]; } 

내가 진정한 또는 을 얻고있다바르 시험에 거짓

ProjectId를 얻을 수있는 방법이 있나요? ?

+0

전 컬렉션을 사용한 적이 없습니다. Request.Form [ "Project"]로 변경하면 어떻게됩니까? –

답변

3

CheckBoxCheckBoxFor 헬퍼는 부울 및 부울에 대한 의미입니까? 속성 (사실, 소스 코드를 보면 속성 값의 캐스팅을 here in the source code으로 확인하십시오). 당신이 볼 수 있듯이

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

, 값이 참/거짓 부울 값으로 하드 코딩되어 다음 CheckBox 도우미의 경우

는, 출력은 다음과 같이 될 것입니다. value 속성을 오버라이드 할 수는 있지만 확인란이 선택되지 않은 경우 값이있는 숨겨진 필드가 아닌 확인란에만 적용됩니다. 부울이 아닌 필드와 함께 도우미를 사용하면 bool에 캐스팅하기 때문에 문제가 발생할 수 있습니다. 나는 위에서 언급했다.

한 가지 가능한 해결책은 수동으로 원하는 html을 만드는 것입니다. (MVC 모델 바인더가 모델을 채우는 데 사용할 이름 속성이므로주의해야합니다.) 당신이 모델 메타 데이터를 사용하는 경우

<input id="Foo" name="Foo" type="checkbox" value="@item.ProjectId"> 
@* you could add another hidden input for when the checkbox is not checked *@ 

또는 복잡한 바인딩이있는 경우, 이것은 당신이 수동으로 HTML 속성을 설정하고 이름에주의해야합니다으로 문제가 될 수 있습니다보기에 이런 식으로 뭔가를 쓰기 속성.

또 다른 옵션은 자신 만의 HTML 도우미를 만드는 것입니다. 이렇게하면 부울뿐 아니라 다른 유형을 사용할 수 있으며 체크 박스가 선택되었을 때 가치가 있어야합니다. 아이디어는 이런 식으로 뭔가를 만드는 것입니다 :

public static class CustomHelpers 
{ 
    public static MvcHtmlString CheckBoxNonBooleanFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object checkedValue) 
    { 
     var fieldName = ExpressionHelper.GetExpressionText(expression); 
     var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName); 
     var fieldId = TagBuilder.CreateSanitizedId(fullBindingName); 

     var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
     var value = metadata.Model; 

     TagBuilder tag = new TagBuilder("input"); 
     tag.Attributes.Add("name", fullBindingName); 
     tag.Attributes.Add("id", fieldId); 
     tag.Attributes.Add("type", "checkbox"); 
     tag.Attributes.Add("value", (checkedValue ?? true).ToString()); 
     if ((checkedValue != null && checkedValue.Equals(value)) 
      ||(checkedValue == null && value == null)) 
     { 
      tag.Attributes.Add("checked", "checked"); 
     } 

     var validationAttributes = html.GetUnobtrusiveValidationAttributes(fullBindingName, metadata); 
     foreach (var key in validationAttributes.Keys) 
     { 
      tag.Attributes.Add(key, validationAttributes[key].ToString()); 
     } 

     return new MvcHtmlString(tag.ToString()); 
    } 
} 

이 헬퍼는 안되의 의견에의 Web.config에서의 네임 스페이스 설정 도우미 네임 스페이스를 포함하는 것을 잊지 (다음 예에서와 같이보기에 사용할 수 있습니다 보기 폴더) :

@Html.CheckBoxNonBooleanFor(m => m.Foo, 132) 

그리고 그것은 당신을 위해 등 메타 데이터 속성, 이름, checked 속성, 같은 것들을 돌보는, 다음 HTML을 생성합니다.

필요한 경우
<input id="Foo" name="Foo" type="checkbox" value="132" data-val="true" data-val-number="The field Foo must be a number."> 

, 당신은 쉽게 체크 박스가 체크되지 않은 상태로 유지 될 때의 원하는 값으로 숨겨진 입력 필드를 추가 할 또 다른 매개 변수 uncheckedValue를 추가 확장 할 수 있습니다.htmlAttributes 매개 변수를 추가하여 임의의 html 속성을 추가로 전달할 수도 있습니다.

마지막 메모에서 다른 int 값을 가진 동일한 필드에 대해 여러 개의 라디오 버튼을 쉽게 가질 수 있으므로 라디오 버튼이 요구 사항에 맞지 않는지 두 번 확인하십시오.

0

나는 체크 박스가 선택된 경우 projectid를 원한다고 가정하고 있습니까?

<td> 
    @Html.Hidden("projectId", item.ProjectId) 
    @Html.CheckBox("selected", false) 
</td> 

[HttpPost] 
public ActionResult Test(int projectId, bool selected) 
{ 
    if (selected) 
    { 
     ///use your projectId 
관련 문제