2013-12-16 1 views
6

나는 오류MVC4 템플릿은 필드 액세스와 함께 사용할 수 있습니다

템플릿 필드 액세스, 속성 액세스에서만 사용할 수 있습니다 , 단일에게 수신이

public class Model 
{ 
    public string Name {get;set;} 
    public int Number {get;set;} 
} 

유사한 MVC 모델을 차원 배열 인덱스 또는 단일 매개 변수 사용자 지정 인덱서 식.

변수에 저장된 모델 람다 식으로 숫자 필드의 레이블을 만들려고 할 때.

@Html.LabelFor(model => model.Name) // Works fine 
@Html.LabelFor(model => model.Number) // Works fine 

@{ 
    Expression<Func<Offer, object>> nameExpression = model => model.Name; 
    Expression<Func<Offer, object>> numberExpression = model => model.Number; 
} 
@Html.LabelFor(nameExpression) // Works fine 
@Html.LabelFor(numberExpression) // Error! 

내가 대신 model => model.Number의, 람다 표현식이 model => Convert(model.Number)있는 디버거를 사용하여 발견하지만, 이것은 단지, 나는 무엇을 말할 수에서 값 유형에 발생합니다

예를 들어, 내보기에 내가 가진 필자는 정수 (null 입력 가능 및 null 허용 불가)와 DateTime 개체를 테스트했습니다. 람다 식의 경우 NodeType은 이고 문자열은 Member access 인 것으로 보입니다.

나는 오류 자체의 원인을 알고 있지만, 컴파일러가 무엇 때문에 model=>model.Number에서 model => Convert(model.Number)으로 평가되는지 알 수 없습니다.

감사합니다.

답변

3

model.Numberint에서 object으로 변환하는 캐스트가 있습니다. 당신이이 표현은

.Lambda #Lambda1<System.Func`2[Model,System.Int32]>(Model $model) { 
    $model.Number 
} 
+0

로 번역되어 Expression<Func<Model, int>>

Expression<Func<Model, int>> numberExpression = model => model.Number; 

를 사용할 필요가 올바른 표현을 얻고 싶은 경우에 당신은 디버거

.Lambda #Lambda1<System.Func'2[Model,System.Object]>(Model $model) { (System.Object)$model.Number } 

와 표현을보고 그것을 확인하실 수 있습니다 감사! 나는 이것을 깨닫지 못했다고 믿을 수 없다. 어리석은 실수이지만, 나는 지금 일하도록한다. – florinszilagyi

관련 문제