2014-01-07 85 views
0

我對ASP.NET MVC很新,所以請友好。ASP.NET MVC控制器語法中的Linq

我有一個非常簡單的數據庫與三個表問題,QuestionOptions,迴應。

問題中的我的pk是Id和指向QuestionOption和Responses中questionId的鏈接。我在問題中也有一個名爲pageId的字段,因此可以在一個頁面上出現多個問題。

我在我的控制器中開始使用它;

// GET: /Questions/ViewQuestion/5 
    public ActionResult ViewQuestion(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Question question = db.Questions.Find(id); 
     if (question == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(question); 
    } 

而我的View完全返回一個問題和選項;

@model Template.Models.Question 

@{ 
    ViewBag.Title = "Details"; 
} 
<div> 
    <h4>Question #@Model.questionId</h4> 
    <hr /> 
<h1> @Html.DisplayFor(model => model.question1)</h1> 
<ul> 
    @foreach (var item in Model.QuestionOptions) 
    { 
     <li>@Html.DisplayFor(modelItem => item.questionOption1)</li> 
    } 
</ul> 

但現在我想創建一個顯示所有具有相同的pageID問題一個觀點 - 我越來越行不通。

這是我的新ActionResult;

 public ActionResult ViewQuestion(int? id) 
    { 
     var pageId = id; 
     var question = from q in db.Questions 
         where q.pageId == pageId 
         orderby q.ranking 
         select new { q.questionId, 
         q.questionType, q.question1} 
         ; 

     return View(question.ToList()); 
    } 

And my View;

@model IEnumerable<Template.Models.Question> 

@{ 
    ViewBag.Title = "View question;"; 
} 

<div> 
    @foreach (var item in Model) { 
    <h4>Question </h4> 
    <hr /> 
    <h1> @Html.DisplayFor(model => item.question1.AsEnumerable())</h1> 

    <ul> 
     @foreach (var item in Model.QuestionOptions) 
     { 
      <li>@Html.DisplayFor(modelItem => item.questionOption1)</li> 
    } 
</ul> 
} 

但現在不承認QuestionOptions作爲模型的一部分了,即使我評論說,部分出我仍然得到錯誤傳遞到字典的模型產品類型 - 但這本字典需要一個System.Collections.Generic.IEnumerable

我知道某處我的語法是非常錯誤的,但我不知道在哪裏搜索3天后。請幫忙!

+0

你能告訴我們問題模型嗎? – Cris

+0

你的第一個例子是返回一個「Question」類型的對象,但你的第二個例子是返回一個匿名類型。這是你的意圖嗎?您可以將您的選擇更改爲'select q' – Mashton

回答

3

在你看來,你期待這種模式: @model IEnumerable<Template.Models.Question>

但你的模型,你會從你的控制器的方法得到的是這種類型的,不是因爲你是返回一個匿名類型的列表。

您需要更改

var question = from q in db.Questions 
       where q.pageId == pageId 
       orderby q.ranking 
       select new { q.questionId, 
          q.questionType, 
          q.question1 }; 

弄成這個樣子:

var question = from q in db.Questions 
       where q.pageId == pageId 
       orderby q.ranking 
       select new Template.Models.Question() 
          { questionId = q.questionId, 
          questionType = q.questionType, 
          question1 = q.question1 }; 

//編輯:

我再看一眼到您的代碼。在你的方法ViewQuestion中,你正在返回你從你的linq查詢中得到的問題。所以我認爲你使用的Model是 不是一個特殊的ViewModel。相反,你傳遞的是Edmx模型。你可以這樣做,但不是很好的做法。該查詢應該爲你工作:

var questions = from q in db.Questions 
       where q.pageId == pageId 
       orderby q.ranking 
       select q; 

但是你應該考慮創建的Question自己的類,你只能指定您需要的頁面上的值,並相應地選擇它們。

// EDIT2:

試想想,你真的需要在您的視圖,並創建一個簡單的類可以保存這些信息。 (這是一個超級簡單的情況下,沒有驗證規則等)

public class QuestionViewModel 
{ 
    public int QuestionId { get; set; } 
    public string QuestionType { get; set; } 
    public string QuestionText { get; set; } 
    // datatypes are only a guess from me, you need to adapt them 
} 

不要忘記更改您的視圖類型

@model IEnumerable<QuestionViewModel> 
+0

我收到一個新錯誤:「實體或複雜類型'ProjectSiteModel.Question'不能在LINQ to Entities查詢中構造。」 – Alex

+0

它仍然拒絕將Model.QuestionOptions作爲問題模型的一部分。我想發佈問題的模型,但它包含在評論中太長。 – Alex

+0

看起來你有不同類型的問題。嘗試指定'Template.Models.Question'而不是'ProjectSiteModel.Question' – Viper

2

您正在創建一個Anonymous type,而不是強類型,其預計Template.Models.Question通過視圖

更好地改變了這可爲基於模型視圖工作

select new { q.questionId, 
         q.questionType, q.question1} 

select new Template.Models.Question{ q.questionId, 
         q.questionType, q.question1} 
0

我不知道我應該這樣做,但是你要見我的問題類,它不適合在評論,我在這裏發佈。請原諒我,如果這是一個禮儀的臀位。

namespace Template.Models 
{ 
using System; 
using System.Collections.Generic; 

public partial class Question 
{ 
    public Question() 
    { 
     this.QuestionOptions = new HashSet<QuestionOption>(); 
     this.Responses = new HashSet<Response>(); 
    } 

    public int questionId { get; set; } 
    public int eventId { get; set; } 
    public int pageId { get; set; } 
    public string question1 { get; set; } 
    public int questionType { get; set; } 
    public Nullable<int> linkedTo { get; set; } 
    public Nullable<int> options { get; set; } 
    public Nullable<int> ranking { get; set; } 

    public virtual ICollection<QuestionOption> QuestionOptions { get; set; } 
    public virtual QuestionType QuestionType1 { get; set; } 
    public virtual ICollection<Response> Responses { get; set; } 
    } 
}