2014-01-20 44 views
0

我正在填充一個包含動態數量的問題的「頁面」,(可選)選項和用戶答案。在調試過程中,我可以看到我的字段已填寫完畢,但無論我嘗試了什麼,QuestionOptions都會填充爲數組。語法來填充linq數組?

這是許多或無選項的一個問題,可以有許多對問題的回答,但每個用戶ID只有1個。

這是我的獲取查詢;

[HttpGet] 
public ActionResult ViewQuestion(int page = 1) { 
    var userId = User.Identity.GetUserId(); 
    var question = (from q in db.Questions 
        join qo in db.QuestionOptions on q.Id equals qo.QuestionId 
        join r in db.Responses on q.Id equals r.QuestionId 
        where q.PageNumber == page && r.UserId == userId 
        select new GetQuestionViewModel 
        { 
// DOESN'T WORK  QuestionOption1 = qo.QuestionOption1.ToList<QuestionOption>(), 
// DOESN'T WORK  QuestionOption = qo.QuestionOptions.ToList<QuestionOption1>(), 
         QuestionOptionRanking = qo.QuestionOptionRanking, 
         Id = q.Id, 
         Options = q.Options, 
         QuestionTypeId = q.QuestionTypeId, 
         Question1 = q.Question1, 
         QuestionRanking = q.QuestionRanking, 
         Answer = r.Answer 
        }).ToList(); 
    return View(question); 
} 

而這是我的ViewModel;

public class GetQuestionViewModel 
{ 
    public IEnumerable<Question> Questions { get; set; } 
    public IEnumerable<QuestionOption> QuestionOptions { get; set; } 
    public int PageNumber { get; set; } 
    public int Id { get; set; } 
    public Nullable<int> Options { get; set; } 
    public string QuestionOption1 { get; set; } 
    public Nullable<int> QuestionOptionRanking { get; set; } 
    public string Question1 { get; set; } 
    public int QuestionTypeId { get; set; } 
    public Nullable<int> QuestionRanking { get; set; } 
    public string Answer { get; set; } 
} 

該視圖可容納4個問題類型;

@using Microsoft.AspNet.Identity 
@model IEnumerable<Template.Models.GetQuestionViewModel> 
@{ 
    ViewBag.Title = "View question"; 
    Html.BeginForm("ViewQuestion", "Question", FormMethod.Post, new { @class = "form-horizontal", role = "form" }); 
} 
@foreach (var q in Model) { var qtype = q.QuestionTypeId; 
<div> 
@Html.AntiForgeryToken(); 
<h1>@q.Question1</h1> 
</div> 
<hr /> 
<div class="form-group"> 
@switch (qtype) 
{ 
    case 1: 
    // Textbox 
     @Html.TextArea("Answer", new { @class = "form-control", rows = "4", col = "5" }); 
     break; 

    case 2: 
    // Dropdown 
    <select class="form-control" id="Answer" name="Answer"> 
     @foreach (var item in q.QuestionOptions.OrderBy(o => o.QuestionOptionRanking)) 
     { 
      <option value="@item.QuestionOption1">@item.QuestionOption1</option> 

     } 
    </select> 
    break; 

case 3: 
// Checkbox 
    <div class="checkbox"> 
     @foreach (var item in q.QuestionOptions.OrderBy(o => o.QuestionOptionRanking)) 
     { 
      <input type="checkbox" name="Answer" value="@item.QuestionOption1" /> @item.QuestionOption1<br /> 

     } 
    </div> 
    break; 

case 4: 
//  Radio buttons 
    foreach (var item in q.QuestionOptions.OrderBy(o => o.QuestionOptionRanking)) 
    { 
    <div class="radio"> 
     <label> 
      <input type="radio" name="Answer" value="@item.QuestionOption1" /> 
      @item.QuestionOption1 
     </label> 
    </div> 
    } 
    break;  
} 
</div> 
<input type="hidden" name="QuestionId" value="@q.Id" /> 
<input type="hidden" name="UserId" value="@User.Identity.GetUserId()" /> 
<input type="hidden" name="page" value="@q.PageNumber" /> 

} 
<div class="form-group"> 
<div class="col-md-offset-2 col-md-10"> 
    <input type="submit" class="btn btn-default" value="Answer" /> 
</div> 
</div> 

任何人都可以發現我出錯的地方嗎?

在此先感謝。

+0

你使用的是Entity Framework嗎? –

+0

是的,但我很新,可能沒有正確實施它.. – Alex

+1

「'在調試過程中,我可以看到我的領域填寫'」,所以你的'問題'列表不是空的?你能顯示你的'View'代碼嗎? – vutran

回答

0

解決方案很簡單;我的查詢全錯了!在一些朋友的幫助下,我最終得到了正確的語法來按我想要的方式執行查詢;按正確的順序將問題分類到正確的頁面,並提供各種選項。以下是最終有效的查詢;

  List<GetQuestionViewModel> quest = new List<GetQuestionViewModel>(); 
     foreach (var item in db.Questions.Where(q => q.PageNumber == page).OrderBy(q => q.QuestionRanking)) 
     { 
      quest.Add(new GetQuestionViewModel() 
      { 
       Id = item.Id, 
       QuestionOptions = db.QuestionOptions 
       .Where(k => k.QuestionId == item.Id) 
       .ToList(), 
       PageNumber = item.PageNumber, 
       Question1 = item.Question1, 
       QuestionRanking = item.QuestionRanking, 
       QuestionTypeId = item.QuestionTypeId 
      }); 
     } 
     return View(quest); 

希望這可以幫助其他人作爲新流利的LINQ爲我!感謝您的輸入。這是一個很大的幫助。