2011-01-21 110 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); 
} 
相关问题