2014-04-30 3 views
4

@Html.RadioButtonFor 확장 메서드를 사용하는 이상한 동작이 있습니다. 나는 foreach 루프를 사용하여 RadioButton 및 By bernary 연산자 목록을 작성합니다. 나는 조건을 존중하는 사람을 검사하도록 설정하려고 노력하고 있지만 항상 검사받는 사람은 마지막입니다. 나는 비슷한 질문을했지만 나는 뭔가를 발견하지 못했습니다. 그리고 맞춤/RadioButtonList을 만들거나 사용하고 싶지 않습니다. 내 보기에서RadioButtonFor()는 Foreach 루프 내에서 기본적으로 선택됩니다.

다음

내 코드 :

@foreach (var item in Model.Entities) 
     { 
     <div> 
       @Html.RadioButtonFor(m => item.Default, item.EntityId, 
         new { @checked = item.Default ? "checked" : "" })//item.Default is a bool and there is only one set to True 
     </div> 
     } 

하지만 내 브라우저에서이 false입니다 checkeditem.Default 경우이다 항상 만든 마지막

. 뭔가가 있습니다

답변

7

되고 싶어 반면, 문구는 브라우저,

(@checked = item.Default) ? "checked" : "" 

로 평가됩니다 체크 표시된 버튼을 참조하십시오. 이것은 HTML5 동작입니다. 모든 라디오 버튼이 checked 속성을 가지고 있고 브라우저가 마지막 버튼을 최종 선택된 것으로 선택했다고 추측합니다.

내 솔루션은 사용자 지정 RadioButtonFor 확장 메서드를 만드는 것입니다.이 메서드는 checked-state에 대한 부울을 허용하며 값에 따라 checked 특성을 htmlAttributes 사전에 추가합니다. 그래서 같은 뭔가 :

public static MvcHtmlString RadioButtonFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object value, object htmlAttributes, bool checkedState) 
    { 
     var htmlAttributeDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 

     if (checkedState) 
     { 
      htmlAttributeDictionary.Add("checked", "checked"); 
     } 

     return htmlHelper.RadioButtonFor(expression, value, htmlAttributeDictionary); 
    } 

당신은 다음보기에이 방법을 사용할 수 있습니다 지금처럼 (당신이 확장 메서드를 만든 네임 스페이스를 추가하고 설정에 넣어하는 것을 잊지 마세요) :

@foreach (var item in Model.Entities) 
    { 
    <div> 
      @Html.RadioButtonFor(m => item.Default, item.EntityId, new { /* other attributes go here */ }, item.Default) 
    </div> 
    } 
-1

운영자의 우선 순위가 문제의 원인입니다. 평등 비교 앞에 오는대로 checked 속성 (상관없이 실제 가치 무엇)가없는 경우 당신이

@checked = (item.Default ? "checked" : "") 
+0

불행히도 나는 같은 결과를 얻는다. 그리고 삼항 운영자는 내가 아는 것에 우선 순위에 따라 행동하지 않아야합니다. –

관련 문제