2015-05-02 61 views
1

我正在將一個Windows桌面應用程序移植到ASP.NET MVC應用程序中。我在數據庫中有一堆表,我能夠創建控制器來生成視圖,它工作正常。我想創建一個頁面來顯示所有具有設置爲false的特定列的名稱。因爲沒有表存儲這些數據,所以我必須使用linq手動查詢結果。所以我所做的就是忽略模型的創建並創建控制器。從數據庫模型中獲取數據並在視圖中顯示它不會顯示

private raceEntities db = new raceEntities(); 

    // GET: Registrants 
    public ActionResult Index() 
    { 
     var registrants = (from per in db.people 
          join personorgrole in db.personorganizationroles on per.PersonID equals personorgrole.PersonID 
          join personeve in db.personevents on personorgrole.PersonOrganizationRoleID equals personeve.PersonOrganizationRoleID 
          join eventcla in db.eventclasses on personeve.RaceEventID equals eventcla.RaceEventID 
          join racecla in db.raceclasses on eventcla.RaceClassID equals racecla.RaceClassID 
          join personeventcla in db.personeventclasses on eventcla.EventClassID equals personeventcla.EventClassID 
          where personorgrole.PersonID == 90946 
          select new { per.FirstName, per.LastName }).ToList(); 
     ViewBag.Res = registrants; 

     return View(); 
    } 

,並在視圖中我有這樣的代碼

@model IEnumerable<IDFWebApp.Controllers.Custom.peopleController> 
@{ 
    ViewBag.Title = "Index"; 
} 

<ul> 
    @foreach (var r in ViewBag.Res) 
    { 
     <li> 
      @r 
     </li> 
    } 
</ul> 

目前該查詢是用於測試目的,看看數據就會顯示在頁面上,但它不顯示姓名。

+0

試着簡化查詢,就像返回一個簡單的名稱數組一樣。這將顯示問題是查詢,控制器還是視圖。 –

+0

另外,你說,「它不顯示名稱」。它有什麼作用? –

回答

0

要在Karl的回答擴大(匿名類型的內部和不能在視圖中訪問),this article給出了爲什麼它不工作

一個很好的解釋你需要創建一個視圖模型

public class PersonVM 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

並修改GET方法

public ActionResult Index() 
{ 
    var registrants = (from per in db.people 
         join personorgrole in db.personorganizationroles on per.PersonID equals personorgrole.PersonID 
         .... 
         where personorgrole.PersonID == 90946 
         select new PersonVM 
         { 
          FirstName = per.FirstName, 
          LastName = per.LastName 
         }).ToList(); 
    return View(registrants); 
} 

並修改視圖

@model IEnumerable<yourAssembly.PersonVM> 
<ul> 
    @foreach (var person in Model) 
    { 
     // Assuming you want to display the FirstName and LastName properties 
     <li><span>@person.LastName</span><span>@person.LastName</span></li> 
    } 
</ul> 
+0

嗯,這真的很奇怪,我的邏輯似乎有些問題。我在一個更簡單的查詢上測試了它,它工作。非常感謝。 – blitz

0

LINQ投影在這裏創建一個匿名類型:

select new { per.FirstName, per.LastName } 

儘管這是在控制器內部精細,它實際上是作用域爲internal,這使得它無法進入該視圖。因此,您避免使用服務器端視圖模型會使您的數據不可用。

製作服務器端視圖模型並將其傳遞給視圖。無論如何,這是ASP.NET MVC開發的標準方法。

不說ViewBag不好,但我會用它作爲第二種方法,而不是作爲視圖模型的替代品。

相關問題