2012-03-20 67 views
0

我有一個問題。ASP.NET MVC 3多個模型使用數據庫的單個窗體

我的問題實際上是擴展了從this之一:

不久 - 我想:3個模型,以及1超級模特這個特定視圖。這個超級模型填充(正確)IENumerable,IENumerable,IENumerable,在View部分中使用它們。 (據我所知,至少...)

在這個話題等雷維爾丹檸提出了很好的和優雅的解決方案,但這種方法不能從DB本身獲取數據...

問題: 必須做什麼才能從數據庫中獲取此模型中的數據,而不是來自「新」實例構造函數?

雖然使用這種方法試圖從DBContext中獲取數據。並得到了一些問題)我無法理解何時(或如何)創建我的DBContext ...或如何訪問由應用程序創建的一個...

試圖在Controller中強制創建它,

using (var Db = new thetaskermvc.Models.TaskerDBContext()) 
    { 
     var themodel = new thetaskermvc.Models.TotalView(); 
     //Jobbers 
     themodel.Jobberz = new Dictionary<int, thetaskermvc.Models.Jobbers>(); 
     var jobbers = from Jobbers in Db.Jobbers.OrderBy(g => g.jobb_name) select Jobbers; 
     foreach (Models.Jobbers ad in jobbers) 
     { 
      themodel.Jobberz.Add(ad.jobb_id, 
        new Models.Jobbers(ad.jobb_id, ad.jobb_name, ad.jobb_from, ad.jobb_carma, ad.jobb_status, ad.jobb_balance, ad.jobb_time)); 
     } 
     if (themodel.Jobberz.Count == 0) 
     { 
      themodel.Jobberz.Add(-1, new Models.Jobbers(0, "NOTHING FOUND",DateTime.Now,0,"",0,0)); 
     } 

    } 

但作爲創建方式背景信息停止它的存在,從控制器將數據傳遞路程後(?) - 我不能用任何其他方法,但得到這個控制器內部的所有數據,並通過填寫模型數據直接添加到集合中(儘管使用IENumerable會根據需要提取數據,就我所知而言)。

所以..如果不是很難,請啓發我 - 可以使用這種方法,還是有其他「常用」方式?旁邊因爲...它的笨拙 - 這個方法效果...

PS我是很新的天冬氨酸,可是...

回答

3

我有one view model per view與來自多個表的數據(如果需要)。在我看來,我有數據需要從2個不同的數據庫表中加載。在我的撥款申請控制器我有以下幾點:

private readonly IBankService bankService; 
private readonly IAccountTypeService accountTypeService; 

public GrantApplicationController(IBankService bankService, IAccountTypeService accountTypeService) 
{ 
    // Check incoming parameters for null values 

    this.bankService = bankService; 
    this.accountTypeService = accountTypeService; 
} 

在我創建的操作方法我填充我的銀行帳戶類型像這樣(在下拉菜單中使用)(不同的表):

public ActionResult Create() 
{ 
    GrantApplicationCreateViewModel viewModel = new GrantApplicationCreateViewModel 
    { 
      Banks = bankService.FindAll(), 
      AccountTypes = accountTypeService.FindAll() 
    } 

    // Do what ever else you need to get done 

    return View(viewModel); 
} 

我的局部視圖模型將是這樣的:

public class GrantApplicationCreateViewModel 
{ 
    public int BankId { get; set; } 
    public IEnumerable<Bank> Banks { get; set; } 
    public int AccountTypeId { get; set; } 
    public IEnumerable<AccountType> AccountTypes { get; set; } 

    // Other properties 
} 

在我的倉庫類我會用這樣的數據庫環境(我用Entity Framework code first):

public class BankRepository : IBankRepository 
{ 
    HefContext db = new HefContext 

    public IEnumerable<Bank> FindAll() 
    { 
      return db.Banks.OrderBy(x => x.Name); 
    } 
} 

在我的數據庫上下文類:

public class HefContext : DbContext 
{ 
    public DbSet<Bank> Banks { get; set; } 
    public DbSet<AccountType> AccountTypes { get; set; } 
} 

這樣做,這樣你可以有多個來源的數據一個視圖模型。我希望這回答了你的問題?如果你需要更多的解釋,請讓我知道:)

+0

完美解答我的問題!我可以看到究竟要做什麼以及如何:) 非常感謝。 – 2012-03-21 14:14:42

+0

只是不要忘記標記我的答案:) – 2012-03-22 08:10:59

+1

很好的答案。我想補充一點,如果您使用的是已導入的數據實體,那麼您可以通過將Linq查詢直接用於控制器創建模型的過程中一起跳過版本庫,[以下是一個示例我在說。](http://pastebin.com/vhgiNzyy) – 2012-07-27 20:04:09

1

你可能想看看this post,它解釋(用示例項目)理想的MVC應用架構應該如何。

在上面的代碼示例中,您不應該在控制器中引用DbContexts。控制器的工作是控制不連接到數據庫的請求流並執行模型填充。

+0

對於小型項目,控制器操作中的DataAccess沒問題。問題是你的持久模型不是視圖模型。 MVC中的模型是一個View Model,它是一個表示View的模型。它與持久模型或領域模型或任何東西沒有關係。 – Phill 2012-03-20 08:51:28

+0

是的,那正是我需要的)「適當」結構。謝謝。 – 2012-03-21 14:12:29

+1

@DerZinger如果它對你有幫助,請將它標記爲答案。 – amythn04 2012-03-22 07:56:36

相關問題