2012-06-26 3 views
1

사용자가 액세스 할 수없는 특정 조건에서 레이블을 렌더링하는 드롭 다운 상자를 만들려고합니다.사용자 지정 HTML 도우미 메서드를 만드는 방법 ASP.Net MVC에서 DropDownFor

지금까지 나는이

public static MvcHtmlString ReadOnlyCapableDropDownFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression, 
     IEnumerable<SelectListItem> selectList, 
     bool enabled, 
     object htmlAttributes 
) 
{ 
    return !enabled ? htmlHelper.DisplayFor(expression) 
      : htmlHelper.DropDownListFor(expression, selectList, htmlAttributes); 
} 

때우기이 올바르게 렌더링을 사용 레이블은 거짓이며, 그것이 사실 드롭 다운은 문제는 라벨의 텍스트가의 id라는 것이다 드롭 다운에 일반적으로 표시되는 텍스트가 아닌 선택 목록 값을 선택하십시오.

이 값은 표시 값에 대한 표현식을 사용할 때 의미가 있습니다.이 표현식을 사용하여 데이터 값이 아닌 선택 목록 항목 텍스트 값을 얻으려면 어떻게해야합니까?

답변

1

식을 컴파일하고 모델에서 값을 검색 할 수 있습니다. 그런 다음 selectList에서 올바른 텍스트를 선택하십시오.

TProperty val = expression.Compile().Invoke(htmlHelper.ViewData.Model); 
SelectListItem selectedItem = selectList.Where(item => item.Value == Convert.ToString(val)).FirstOrDefault(); 
string text = ""; 
if (selectedItem != null) text = selectedItem.Text; 

return !enabled ? new MvcHtmlString("<span>" + text + "</span>") 
     : htmlHelper.DropDownListFor(expression, selectList, htmlAttributes); 

나는 당신이 가진 모든 정보가 어쨌든 selectList의 문자열에 포함되어 있기 때문에,이 경우에 충분합니다 임시 MvcHtmlString를 반환 생각합니다. (헬퍼 메소드가 데이터 주석 등에 액세스 할 수있는 것과 같지 않음)

+0

MvcHtmlString과 함께 사소한 오류가 발생하고 .Create를 사용해야하는 동시에 FirstOrDefault()로 변경해야합니다. 그렇지 않으면 모두 좋은, 건배 –

1

직접 텍스트 값을 찾아야합니다.

? htmlHelper.DisplayFor(selectList.Single(x=>x.Value == expression).Text 

당신이 위의 코드에서 사용하기 전에 식을 평가해야 할 수도 있지만 : 당신이 사용할 수있는 선택 목록이 있기 때문에이 일상에서 할 수 있어야합니다.

+0

* expression *은 문자열이 아닌 Expression 유형이므로이 방법은 작동하지 않습니다. 어떻게 든 식을 해결해야합니다. – McGarnagle

+0

ExpressionHelper.GetExpressionText는 문자열로 해석되지만 여전히 컴파일 할 수 없습니다. –

+0

@dbaseman은 올바른 아이디어를 가지고 있습니다. DisplayFor는 필요 없으며, span을 생성하고 텍스트를 반환합니다. –

관련 문제