0

이 문제는 설명하기가 조금 어렵 기 때문에 예제를 제공하려고합니다. 내가보기에 다음과 같은 말한다면런타임에 편집기 템플릿

public class Form { 
    public IList<FieldResult<object>> Results { get; set; } 

    public Form(IList<Field> fields) { 
     Results = fields.Select(f => new FieldResult<object>(f)).ToList(); 
    } 
} 

가 :

@foreach (var result in Model.Results) { 
    @Html.EditorFor(m => result, "CheckBoxField") 
} 

을 지금은이 말을

public class FieldResult<T> { 
    public Field Field { get; set; } 
    public T Answer { get; set; } 

    public FieldResult(Field field) { 
     Field = field; 
    } 
} 

지금 나는 다음 뷰 모델을 가지고 말 : 나는 다음과 같은 유형이 말 다음 CheckBoxField 편집기 템플릿 :

@model FieldResult<bool> 
@Html.CheckBoxFor(m => m.Answer) 

그것은 모두가 잘 컴파일하지만 런타임에 다음과 같은 오류가 발생합니다 : 사전에 전달

모델 항목 유형 이다 '1[System.Object]', but this dictionary requires a model item of type 'FieldResult 1 [선택 System.Boolean] FieldResult'.

누군가가 가능하다고 말할 수 있고 가능한 방법을 제안 할 수 있다면 감사하겠습니다. 감사합니다

답변

1

FieldResult<object> 모델의 형식이 FieldResult<bool> 인 템플릿에 값을 전달하려고하면 형식이 다르므로 해당 오류가 발생합니다. Results 속성을 변경하여 IList<FieldResult<bool>>으로 만들거나 컬렉션 항목을보기에 전송할 수 있습니다.

당신은 결과의 다른 유형을 구축해야하는 경우, 당신은 또한 클래스 상속을 사용하여 고려할 수 :

public abstract class FieldResult { 
    public Field Field { get; set; } 

    public FieldResult(Field field) { 
     Field = field; 
    } 
} 

public class BooleanFieldResult : FieldResult { 
    public bool Answer { get; set; } 

    public FieldResult(Field field) : base(field) { 
    } 
} 

귀하의 Form 클래스는 다음과 같이 보일 것이다 :

public class Form { 
    public IList<FieldResult> Results { get; set; } 

    public Form(IList<Field> fields) { 
     Results = // ... you choose which child class inherited from FieldResult you want to use 
    } 
} 

로보기 확인 할 유형 그것은 :

@foreach (var result in Model.Results) { 
    if(result is BooleanFieldResult) { 
     var booleanResult = (BooleanFieldResult)result; 
     @Html.EditorFor(m => booleanResult , "CheckBoxField") 
    } 
} 

귀하의 템플릿은 다음과 같습니다.

@model BooleanFieldResult 
@Html.CheckBoxFor(m => m.Answer) 
+0

감사합니다. "서식 파일은 필드 액세스, 속성 액세스, 단일 차원 배열 인덱스 또는 단일 매개 변수 사용자 지정 인덱서 식에만 사용할 수 있습니다."라는 오류가있었습니다. 그래서 저는 편집기 외부에서 캐스트를 가져 와서 변수에 저장하고 올바르게 표시했습니다. 나는 더 많은 일을 해줄 필요가 있지만 지금 올바른 방향으로 나를 보내 주셔서 감사합니다. – nfplee

+0

당신 말이 맞아요, 제 대답을 편집했습니다 –

+0

방금 ​​시험을 마쳤습니다. 그리고 이것은 잘 작동하고 있습니다. 나는 많은 쓰레기 코드를 제거 할 수 있었고,이 접근법을 통해 각 필드 유형에 대한 사용자 정의 유효성 검사를 수행 할 수있었습니다. 다시 한번 감사드립니다. – nfplee