2011-08-21 22 views
0

我正在構建一個問題。它一次顯示兩個問題。問題可以是不同的類型。例如,多項選擇問題和「矩陣」問題,其中有許多行和列需要回答。當視圖需要基於條件的不同視圖模型時,如何建模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。

這個視圖模型應該怎麼樣子的呢?

我的想法是爲每個類型的問題的列表,在主視圖模型,就像這樣:

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

如果沒有在分類型選擇題的問題,該清單將是空而不是被使用。這是好的做法嗎?

回答

1

有些事情,你可以嘗試是這樣的。我不是100%肯定它會工作,因爲我不知道MVC框架只會查找模型類型,或者它是真正的類型。

傳遞一個底座作爲CLAS模型類型,然後從基類派生類型您不同的ViewModels。然後你爲每個問題類型定義編輯器模板,只需使用DisplayFor或EditorFor類型,並讓它自己渲染。

正如我所說的,這將取決於MVC是否使用它的最終形式,或只是基本類型。

編輯:

您創建的基類,稱爲QuestionViewModel,它並不需要有任何屬性或方法,但如果有共同的方法或屬性,你可以把它們放在這裏。

然後從QuestionViewModel導出MultipleChoiceViewModelGridQuestionViewModel

在你看來:

@model IEnumerable<QuestionViewModel> 

@Html.EditorForModel() 

然後你在你的瀏覽/文件夾無論在你的瀏覽/共享文件夾爲每種類型的,則定義爲每種類型的HTML創建一個名爲EditorTemplates文件夾。

MVC應自動知道一個問題是GridQuestionViewModel,當你通過你對他們的列表中使用它的編輯模板。

+0

,所以我不應該使用的ViewModels? – Nanek

+0

是的,你應該。這就是爲什麼我說「然後推導出不同的視角模型」。不知道你如何推斷​​這意味着「不要使用視圖模型」 –

+0

你可能提供一個快速的例子嗎? – Nanek

相關問題