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 차원 배열 색인 또는 단일 매개 변수 사용자 정의 인덱서 식.
도움을 주시면 감사하겠습니다. 이것은 내가 작업하고있는 개념 프로젝트의 증거이며,이 작품을 사용하지 않으면 물 속에서 죽어 있습니다.
감사합니다 : 당신이 올바른 유형의 인수
TextBoxFor<TModel, TProperty>()
를 호출하기 위해 동적 바인딩 사용된다 무엇을 할 수 있는지. 이렇게하면 'TextBoxFor'라는 적용 가능한 메서드가 없다는 런타임 오류가 발생하지만 그 이름으로 확장 메서드가있는 것으로 보입니다. 확장 메서드는 동적으로 디스패치 할 수 없습니다. 어떤 아이디어? 저는 각각 다른 리턴 타입을 사용하는 4 개 또는 5 개의 다른 GetParameter 메소드를 정의하고 개념 증명을 위해 작동하는 뷰에서 조건문을 사용하여이 모든 문제를 해결할 수있었습니다. 그러나 사람은보기 흉합니다. – jfin3204
'TextBoxFor()'를 정적으로 호출하면 어떨까요? '@ InputExtensions.TextBoxFor (Html, (동적) Model.GetParameterByName (소품))' –
당신은 아름다운 사람입니다. 그것은 트릭을했다. 정말 고맙습니다. – jfin3204