2011-01-21 205 views
2

我有一個使用EF Table Per Type設置的數據庫,並且我正在嘗試在Razor中爲詳細信息頁面編寫詳細信息視圖。棘手的部分是我有一個基類Product和兩個派生類VideoProductDatabaseProduct,我想在列表視圖中顯示它們,並能夠爲每種類型提供詳細信息視圖。我無法確定如何根據從數據庫返回的對象的類型確定返回哪個視圖。下面是一些代碼:如何基於模型的「類型」顯示正確的視圖?

機型:

public abstract class Product 
{ 
    // some properties 
} 

public class DatabaseProduct 
{ 
    int SpecialInvoiceID { get; set; } 
} 

public class VideoProduct 
{ 
    public virtual ICollection<FilmsCollection> FilmsCollectionIDs { get; set; } 
    public virtual ICollection<OtherCollection> OtherCollectionIDs { get; set; } 
} 

控制器:

public ActionResult Details(int id) 
{ 
    var product = db.Products.Find(id); // could be a VideoProduct or a DatabaseProduct 

    if (product == null) 
     return RedirectToAction("Index"); 

    return View("Details", product); 
} 

VIEW:

什麼我在這裏做,讓細節查看以顯示任何類型的模型?或者我可以在Controller中做什麼來調用不同的視圖來顯示不同的模型類?或者我可以使用DisplayForModel?

我試圖通過Google找到一個例子,但我無法獲得任何有用的信息。任何指導將不勝感激。謝謝!

回答

2

你將不得不使用Queryable.OfType(TResult)擴展方法,以過濾型DatabaseProduct或VideoProduct的實體。看看這個示例代碼

DatabaseProduct dbp = (from d in db.Products.OfType<DatabaseProduct>() 
         where d.Id == id 
         select d.FirstOrDefault(); 

這種查詢可以過濾某種類型的實體,所以你可以在你建立的產品列表中相應的行動(例如將用戶重定向到兩個不同的細節動作或某事那樣)

看一看here瞭解更多信息。

+1

我結束了使用DisplayForModel,但其實這就是我一直在尋找。謝謝! – samandmoore 2011-01-21 16:57:42

1

你可以試試這個方法:

public ActionResult Details(int id) 
{ 
    var product = db.Products.Find(id); // could be a VideoProduct or a DatabaseProduct 

    if (product == null) 
     return RedirectToAction("Index"); 

    return View(product.GetType().Name, product); 
} 
相關問題