2011-08-21 2 views
0

나는 설문 조사를 만들고 있습니다. 한 번에 두 가지 질문을 표시합니다. 질문은 다른 유형 일 수 있습니다. 예를 들어 복수 선택 질문 및 "행렬"질문으로 답해야 할 행과 열이 많이 있습니다.View가 조건에 따라 다른 ViewModel을 필요로 할 때 ViewModel을 모델링하는 방법은 무엇입니까?

나는 현재 질문의 목록을 검색 ViewModels, 바로 개체 모델 (내가 이렇게 야해 알) ...

코드를 사용하고 있지 않다

:보기는 다음과 같습니다

 public ActionResult QuestionList(int categoryId, int page) 
    { 
     var questions = new PagedData<Question>(); 

     questions.Data = db.Question.Where(c => c.category_id == categoryId).OrderBy(p => p.question_number).Skip(PageSize * (page - 1)).Take(PageSize).ToList(); 
     questions.NumberOfPages = Convert.ToInt32(Math.Ceiling((double)db.Question.Where(cc => cc.category_id == categoryId).Count()/PageSize)); 
     questions.CurrentPage = page; 
     questions.CategoryID = categoryId; 

     return PartialView("QuestionList", questions); 
    } 

:

@model MvcApplication3.Helpers.Paging.PagedData<MvcApplication3.Models.Question> 


@if (Model.Data.Count() == 0) 
{ 
<h2>Denne kategori har ingen spørgsmål</h2> 
} 
else 
{ 
    <h2>@Model.Data.First().Category.category_name</h2> 

    <br /> 

    <div> 

    Tryk for at komme videre til side: 

    @for (int i = 1; i <= Model.NumberOfPages; i++) 
    { 
     if (i == Model.CurrentPage) 
     { 
      @i 
     } 
     else 
     { 
      <a class="page-number" href="javascript:void();">@i</a> 
     } 
    } 
    </div> 
    <br /> 

    foreach (var item in Model.Data) 
    { 
     if (item.visible == true) 
     { 
      String isAnswered = null; 
      if (item.Tabelform_Answers.Count() >= 1) 
      { 
       isAnswered = "answered"; 
      } 
      else if(item.MCQ_Answers.Count() >= 1) 
      { 
       isAnswered = "answered"; 
      } 
      else 
      { 
       isAnswered = "unanswered"; 
      } 

      <div [email protected]> 

      @if (User.IsInRole("Administrator")) 
      { 
       @Html.ActionLink("[Rediger]", "Edit", "AdminQuestion", new { id = item.question_id }, null)  
      } 

      @Html.LabelFor(y => item.question_wording, item.question_wording, new { @class = "tooltip", title = @item.help_text }) 

      @if (item.Question_Type.type_description == "Multiple Choice") 
      { 
       <br /> 
       @Html.Partial("MCQDisplay", item) 
      } 
      else if (item.Question_Type.type_description == "Tabelform") 
      { 
       <br /><br /> 
       @Html.Partial("GridDisplay", item) 
      } 

      </div> 
      <br /> 
     } 
    } 

} 

@Html.HiddenFor(m => m.NumberOfPages) 
@Html.HiddenFor(m => m.CategoryID) 
@Html.HiddenFor(m => m.CurrentPage) 

대신에 부분적인 전망 MCQDisplay과 GRIDDISPLAY에 전체 질문의 실체를 보내는, 난 단지 데이터 neccecary를 보내고 싶습니다.

이 ViewModel의 모습은 어떻습니까?

List<MultipleChoiceViewModel> mcqlist; 
List<GridQuestionViewModel> gridlist; 

범주를 입력 다중 선택의 아무 문제가없는 경우

,리스트가 null이 될 것입니다 :

내 생각은 다음과 같이, 메인 뷰 모델에서, 질문의 각 유형에 대한 목록을 가지고 있었다 사용하지 마십시오. 이 좋은 습관인가?

답변

1

시도해 볼만한 것이 있습니다. MVC 프레임 워크 만 모델 유형을 찾는지 또는 실제 유형인지는 모르므로 100 % 확신 할 수 없습니다.

기본 clas를 모델 유형으로 전달한 다음 기본 클래스 유형에서 다른 viewmodels을 파생시킵니다. 그런 다음 각 질문 유형별 편집기 템플릿을 정의하고 해당 형식에 대해 DisplayFor 또는 EditorFor를 사용하고 자체적으로 렌더링하도록합니다.

앞서 말했듯이 MVC가 궁극적 인 유형인지 기본 유형인지에 따라 달라집니다.

편집 : QuestionViewModel라고

당신은 기본 클래스를 생성은, 그것이 어떤 속성이나 방법이 필요하지 않지만 일반적인 방법 또는 속성이있는 경우 여기에 넣어 수 있습니다.

MultipleChoiceViewModelGridQuestionViewModelQuestionViewModel에서 유도하십시오. 보기에

:

@model IEnumerable<QuestionViewModel> 

@Html.EditorForModel() 

그런 다음 당신은 당신의보기에서/공유 폴더는 각 유형, 각 유형에 대한 당신의 HTML을 정의 무엇이든간에 폴더를 사용자의 조회수 /에 EditorTemplates라는 폴더를 만듭니다.

MVC는 질문이 GridQuestionViewModel임을 자동으로 인식하고 목록을 전달할 때 해당 템플릿을 사용합니다.

+0

그래서 ViewModels를 사용하지 않아야합니까? – Nanek

+0

예, 그렇습니다. 그것이 내가 "그때 당신의 다른 뷰 모델을 파생시킨다"고 말한 이유입니다. "뷰 모델을 사용하지 마십시오"라는 의미로 어떻게 추측 할 수 있는지 잘 모르겠습니다. –

+0

간단한 예제를 제공해 주시겠습니까? – Nanek

관련 문제