2012-07-11 58 views
1

我是MVC的新手,所以请原谅我的问题听起来很愚蠢或太简单。我正在使用实体数据模型进行数据库访问。所以在我的Models文件夹中,我添加了一个EDMX文件,并且可以从我的控制器和强类型视图访问模型类。当我在控制器中访问多个表格时出现问题,例如如何从控制器传递匿名对象的集合来查看

如果我有以下我的数据库表:

Departments(DepartmentID, DepartmentName, DepartmentPhone) 
Insurances(InsuranceID, InsuranceName, InsuranceAddress) 
Employees(EmployeeID, EmpFName, EmpLName, DepartmentID, InsuranceID) 

而且我想他们的部门和保险信息显示员工列表。

在我的控制器的操作方法我访问DB使用EDM和匿名类型得到的信息:

using (var context = new MyEntities()) 
     { 
      var model = (from d in context.Departments 
         join e in context.Employees on d.DepartmentID equals e.DepartmentID 
         join I in context.Insurances on I.InsuranceID equals e.InsuranceID 

         select new 
         { 
          DepartmentID = d.DepartmentID, 
          EmployeeID= e.EmployeeID, 
          EmpFName= e.EmpFName, 
          EmpLName= e.EmpLName, 
          DepartmentName= d.DepartmentName, 
          InsuranceName= I.InsuranceName 

         }).ToList(); 

      return View(model); 
     } 

我没有一类这个匿名类型的在我的模型文件夹,这样我就可以”创建一个强类型的视图。那么将这个列表传递给View的最好方法是什么?如果集合太大,使用viewbag将会是一个过度杀伤力。为这个匿名类创建一个新的模型听起来不正确,因为如果我在Controllers Action Method中更改我的选择,它需要随时更新。

欢迎您提出任何建议。我试图通过其他问题来看看,但找不到任何相关的东西。

谢谢。

回答

2

我没有在我的模型文件夹一类这个匿名类型的,所以我 不能创建一个强类型的视图

右键单击您的项目,添加新的类...现在你的模型文件夹中有一个类型。这是ASP.NET MVC =>查看模型的方法。

而且那么显然你通过这个类型,你的看法:

select new MyViewModel 
{ 
    DepartmentID = d.DepartmentID, 
    EmployeeID = e.EmployeeID, 
    EmpFName = e.EmpFName, 
    EmpLName = e.EmpLName, 
    DepartmentName = d.DepartmentName, 
    InsuranceName = I.InsuranceName 
}).ToList(); 

当然,现在你的看法变成强类型这个视图模型和:

@model IEnumerable<MyViewModel> 
... 
+0

这种方法使你在IntelliSense支持你视图,并且可以让您轻松使用所有'* For'方法,如果您需要它们。此外,它允许您选择在相同模型中发回信息,如果更新或插入有用。 – 2012-07-12 06:59:27

+0

Darin plz看到我的回复。 – shazia 2012-07-13 02:38:53

+0

你为什么在'foreach'循环中使用'@ model'? '@ model'应该只在您的视图中出现一次(通常在顶部),表明该视图是强类型的模型:'@model List '。然后在循环内而不是'@ model'使用'@ item'。 – 2012-07-13 05:52:07

0

恐怕预先定义的强类型ViewModel是要走的路。要在多个地方更新看似重复的代码是一种痛苦,但根据我的经验,这只是小型项目的一个问题。随着项目的增长,您开始发现数据库模型对象(实体)和传递给视图的视图模型(如验证和处理属性以及特定于视图的数据)之间的差异,并且当您到达该点时,您开始更喜欢使用单独的实体和ViewModel定义。

但是,回到主题:您的问题的替代解决方案是使用反射将匿名类型转换为Dictionary<String,Object>对象。请注意,ASP.NET MVC会将new { foo = "bar" } -syntax表达式转换为路由值和HTML属性的字典。性能是可以接受的,但不要试图为10,000个对象执行单个HTTP请求,否则您可能会陷入困境。

下面是该代码将看起来像:

Object anonymousType = new { whatever = "foo" }; 
Dictionary<String,Object> dict = new Dictionary<String,Object>(); 

foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(anonymousType)) { 
    Object value = descriptor.GetValue(anonymousType); 
    dict.Add(descriptor.Name, value); 
} 

当然,这意味着你的意见将不会从编译时类型检查中受益,你必须保持的记录列表字典键(假设你没有遍历视图中的键)。

我会注意到,我很惊讶微软没有让匿名类型自动实现IDictionary,因为它看起来很自然。

0

dynamic类型是你的朋友。

你可以声明你的观点作为松散类型,有一个动态的模型

@model dynamic 

你会访问模型属性,你就在强类型的视图

<h1>Model.DepartmentId</h1> - <h2>Model.DepartmentName</h2> 
<span>Model.EmployeeId</span> 

的问题想,这动态包含内部属性,如果您使用的是MVC2,则需要一点点trick才能使其正常工作。但似乎对于MVC3和更高版本,它不再需要。

相关问题