뷰 모델 유형의 일반 인수를 사용하는 정적 일반 FormBuilder HTML 도우미 메서드 (HTMLHelper 클래스의 확장 메서드)가 있으며 데이터베이스에서 하나 이상의 문자열 속성 이름이 전달되면 .NET 4.5를 사용하여 ASP.NET MVC 5.1에서 HTML 양식을 생성합니다.반환 형식 람다 식을 동적으로 표현
양식을 생성하는 공용 메서드가 하나 있고 양식 내의 "모듈"섹션을 생성하기 위해 개별 메서드를 분리 한 다음 각 필드를 그 안에 각각 렌더링합니다. 타입 인자는이 체인을 위에서 아래로 전달됩니다. 은 "RenderField"방법에서
나는 사용하여 입력 된 Html 헬퍼를 작성 도우미가 RenderForm 방법으로 확장 Html 헬퍼 인 코드 -var typedHelper = helper as HtmlHelper<TModel>;
.
그때 이것은 내가 나중에이 문자열 편집기 작동 follows-
fieldContainer.InnerHtml += typedHelper.EditorFor(expression);
fieldContainer.InnerHtml += typedHelper.ValidationMessageFor(expression);
같은 EditorFor, DisplayFor, 또는 ValidationMessageFor을 만드는 데 사용할 수있는 코드 -
var modelType = typeof(TModel);
...
var modelProperty = modelType.GetProperty(field.PropertyName);
if (modelProperty == null)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(new ArgumentException(string.Format("Model {0} does not contain property {1}", modelType.Name, field.PropertyName)));
return null;
}
var modelPropertyType = modelProperty.PropertyType;
var parameter = Expression.Parameter(modelType, "m");
var property = Expression.Property(parameter, field.PropertyName);
var expression = Expression.Lambda<Func<TModel, object>>(property, parameter);
사용하여 수식을 만듭니다 ,하지만 nullable datetime을 시도하면 오류가 발생합니다.
형식이 'System.Nullable`1 [S ystem.DateTime] ' 는 반환 형식을 사용할 수 없습니다'으로 System.Object '
나는 시도하고 다음과 같은 라인 -
을 변경하여 내가 존 소총 답변에서 보았 듯이 객체에 속성을 변환하면var expression = Expression.Lambda<Func<TModel, object>>(Expression.Convert(property, typeof(object)), parameter);
그리고 편집자 코드 변경 -
var compiledExpression = expression.Compile()(model);
fieldContainer.InnerHtml += typedHelper.EditorFor(compiledExpression);
fieldContainer.InnerHtml += typedHelper.ValidationMessageFor(compiledExpression);
내가 유형의 인수가 사용에서 유추 할 수없는 오류 메시지를.
반환 유형을 "동적"으로 변경하면 "확장 메서드를 동적으로 디스패치 할 수 없습니다"라는 메시지가 표시됩니다.
제네릭 메서드의 반환 인수로 "modelPropertyType"을 지정할 수 없습니다. 아마도 컴파일 타임에 구체 형식이 될 수있는 것은 아니기 때문일 수 있습니다.
ASP.NET MVC에서 제공하는 EditorFor 도우미 메서드를 사용할 수 있도록 런타임에 속성의 반환 형식을 동적으로 지정할 수있는 방법이 있습니까?
마지막으로 제출 한 코드는 우리 사양의 복잡성으로 인해 솔루션 전체에 표면적 인 유사점을 지니지 만 ** 사용자의 호출 및 MakeGenericMethod 코드에 의해 완전히 뒷받침됩니다 **. 당신에게 감사의 커다란 빚을지고 제가 할 수 있다면 여러 번 upvote 할 것입니다. 며칠 동안 현상금을 낼 수는 없지만 가능한 한 빨리 상금을 수여 할 것입니다. – pwdst
걱정하지 마세요. @pwdst, 도움이 되었기 때문에 기쁩니다! (예, HTML을 생성하여 양식을 작성하고 양식의 전체 예제를 생성했지만 아이디어가 명확 해지기를 바랍니다 :)) –
Bounty는 실제로 24 시간 동안 수여 할 수는 없지만 발행했습니다. . – pwdst