2012-03-20 30 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

相关问题