2014-04-10 32 views
0

我對MVC非常陌生,所以請原諒我對它的陌生感。從單獨的表格添加數據到MVC視圖

我正在試驗一個項目,並且遇到了以下問題:如果沒有通過外鍵關聯連接,如何從單獨的數據庫表中引入數據。

我有一個表的列其中一列可能會或可能不匹配另一個表中的值,如果它需要標記它。

例子:

比方說,爲了簡單起見,有一個表的收藏和一張桌子StuffAtStore,他們有這些領域:

StuffAtStore 
    Price 
    Name 

Wishlist 
    Name 
    Person 

我想列出的StuffAtStore所有項目,如果任何是這樣StuffAtStore.Name == Wishlist.Name我想在價格後添加文字「On」+ Wishlist.Person +「的願望清單」。

基於一些建議,我在網上找到什麼我能得到的工作是這樣的

public partial class StuffAtStore 
{ 
    public string PersonIfAny 
    { 
     get 
     { 
      FooEntities db = new FooEntities(); 

      if (db.Wishlist.Any(w => w.Name == Name)) 
      { 
       return db.Wishlist.First(w => w.Name == Name).Person; 
      } 
      else 
      { 
       return ""; 
      } 
     } 
    } 
} 

而且

@Html.DisplayFor(modelItem => item.Price) 

@if (item.PersonIfAny != "") 
{ 
    @Html.PersonIfAny(modelItem => item.PersonIfAny) 
} 

但當然,這是非常非常慢創造一些。

什麼是最好/最正確的方式來做到這一點與MVC?

+0

這似乎是數據庫問題比MVC更多 – NWard

回答

0

你真的應該考慮有一個ViewModel類如如下:

class StuffViewModel { 
    string Name { get; set; } 
    string Price { get; set; } 
    string PersonIfAny { get; set; } 
} 

然後,在你Controller/Action,:

void YourAction(...) { 
    FooEntities db = new FooEntities(); 
    var stuff = db.StuffAtStore.Select(s => 
     new StuffViewModel 
     { 
      Name = s.Name, 
      Price = s.Price, 

      // This will use Outer Apply, which may not be available 
      // for EF providers other than Microsoft's MSSQL provider. 
      PersonIfAny = db.Wishlist.Where(w => w.Name == s.Name) 
          .Select(w => w.Person).FirstOrDefault(); 
     } 

    foreach(var s : stuff) 
    { 
     s.PersonIfAny = s.PersonIfAny ?? ""; 
    } 


    return View(stuff); 

} 
1

這真的不是一個MVC問題,而是一個如何高效檢索數據的問題。

它看起來像你使用實體框架。即使StuffAtStore和Wishlist之間沒有數據庫級別的外鍵,您仍然可以在EF中的這兩個實體之間創建關係。然後,在檢索StuffAtStore時,您可以簡單地加入Wishlist。如果Wishlist不包含該項目,則該集合將爲空。

話雖如此,如果您的願望清單項目是真正的商店項目,您應該一路回到您的數據庫設計,並有這些表格之間的外鍵,而不是試圖通過任意名稱列連接它們。

0

也許你可以爲你的觀點製作ViewModel。實際上,這是一個簡單的類,您可以從您的控制器向您的視圖提供內容,並且在聲明某些成員(例如,將包含已顯示的已準備好的字符串的List<string>)以及構造函數中,這些構造函數將使用表之間的聯接(好吧,事實上是左連接)。我認爲ViewModels(不像在MVVM模式中,但幾乎)是向您的視圖呈現複雜數據結構的最佳方式,如果您的基類(您的Model)不適合完美匹配,它會變得更簡單。

這裏有一些很好的教程:http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-3

相關問題