2014-02-12 2 views
3

MVC 프로젝트에서 작업 중이며 Html.TextboxFor 메서드에 속성 이름을 전달하고 싶습니다. 이것은 다음보기에서 나는이구성원 식에서 Nullable 십진수의 개체로 변환 할 수 없습니다.

@foreach (var prop in Model.RuleModel.GetType().GetProperties()) 
    { 
     var result = Model.Metadata.Columns.SingleOrDefault(m => m.ColumnName == prop.Name); 
     if (result != null) 
     { 
      <td> 
       @Html.TextBoxFor(Model.GetParameterByName(prop)) 
      </td> 
     } 
    } 

문제는 속성 유형 진수의 경우?, 나는 오류를 반대하는 null 허용 진수를 변환 할 수 없습니다 얻을 수 있다는 것입니다 할 내 뷰 모델

public class RuleViewModel<T> where T : class, IValidatableObject 
{ 
    private T _rule; 
    public T RuleModel 
    { 
     get 
     { 
      return _rule 
       ?? (_rule = Activator.CreateInstance<T>()); 
     } 
    } 

    public RuleMetadata Metadata { get; set; } 

    public Expression<Func<RuleViewModel<T>, Object>> GetParameterByName(PropertyInfo pi) 
    { 
     var fieldName = Expression.Parameter(typeof(RuleViewModel<T>), "x"); 
     var fieldExpression = Expression.PropertyOrField(Expression.Property(fieldName, "RuleModel"), pi.Name); 
     var exp = Expression.Lambda<Func<RuleViewModel<T>, Object>>(fieldExpression, fieldName); 
     return exp; 
    } 

} 

입니다. 주위를 둘러 보았고 Expression.Convert를 사용하여이 문제를 해결할 수 있음을 알았지 만보기에서 오류가 발생했습니다.

템플릿은 필드 액세스, 속성 액세스, 1 차원 배열 색인 또는 단일 매개 변수 사용자 정의 인덱서 식.

도움을 주시면 감사하겠습니다. 이것은 내가 작업하고있는 개념 프로젝트의 증거이며,이 작품을 사용하지 않으면 물 속에서 죽어 있습니다.

답변

2

TextBoxFor<TModel, TProperty>()을 호출 할 때 objectTProperty으로 사용할 수 없다는 것이 문제입니다. Func<TModel, TProperty> 형식의 람다 식과 C#의 분산 규칙은 Func<TModel, decimal?>Func<TModel, object>과 할당 호환되지 않도록합니다. 또한 Convert()을 단순히 사용할 수 없습니다. MVC 내부가 Convert 표현 인 람다를 허용하지 않기 때문입니다. 도움을

public Expression GetParameterByName(PropertyInfo pi) 
{ 
    var fieldName = Expression.Parameter(typeof(RuleViewModel<T>), "x"); 
    var fieldExpression = Expression.PropertyOrField(
     Expression.Property(fieldName, "RuleModel"), 
     pi.Name); 
    var exp = Expression.Lambda(
     typeof(Func<,>).MakeGenericType(typeof(RuleViewModel<T>), fieldExpression.Type), 
     fieldExpression, 
     fieldName); 
    return exp; 
} 

// ... 

@InputExtensions.TextBoxFor(Html, (dynamic)Model.GetParameterByName(prop)) 
+0

감사합니다 : 당신이 올바른 유형의 인수 TextBoxFor<TModel, TProperty>()를 호출하기 위해 동적 바인딩 사용된다 무엇을 할 수 있는지

. 이렇게하면 'TextBoxFor'라는 적용 가능한 메서드가 없다는 런타임 오류가 발생하지만 그 이름으로 확장 메서드가있는 것으로 보입니다. 확장 메서드는 동적으로 디스패치 할 수 없습니다. 어떤 아이디어? 저는 각각 다른 리턴 타입을 사용하는 4 개 또는 5 개의 다른 GetParameter 메소드를 정의하고 개념 증명을 위해 작동하는 뷰에서 조건문을 사용하여이 모든 문제를 해결할 수있었습니다. 그러나 사람은보기 흉합니다. – jfin3204

+0

'TextBoxFor()'를 정적으로 호출하면 어떨까요? '@ InputExtensions.TextBoxFor (Html, (동적) Model.GetParameterByName (소품))' –

+0

당신은 아름다운 사람입니다. 그것은 트릭을했다. 정말 고맙습니다. – jfin3204