我刚刚开始使用ASP.NET MVC,因为它是测试版。在我的代码中,我运行一个简单的LINQ to SQL查询以获取结果列表并将其传递到我的视图。这种事情:
var ords = from o in db.Orders where o.OrderDate == DateTime.Today select o; return View(ords);
然而,在我的视图中,我意识到,我需要访问客户的名称为每个订单。我开始使用o.Customer.Name,但我相当确定这是为每个订单执行单独的查询(因为LINQ的延迟加载)。
var ords = from o in db.Orders from c in db.Customers where o.OrderDate == DateTime.Today and o.CustomerID == c.CustomerID select new { o.OrderID,/* ... */,c.CustomerName }; return View(ords);
除了现在我的“ords”变量是一个匿名类型的IEnumerable。
是否可以声明一个ASP.NET MVC视图,它接受一个IEnumerable作为其视图数据,其中T由从控制器传递的内容定义,或者我必须定义一个具体类型从我的查询填充?
解决方法
你能把它传递给视图吗?是的,但您的视图不会被强烈打字。但帮助者会工作。例如:
public ActionResult Foo() { return View(new {Something="Hey,it worked!"}); } //Using a normal ViewPage <%= Html.TextBox("Something") %>
那个文本框应该呈现“嘿,它工作!作为值。
所以,你可以定义一个视图,其中T是由从控制器传递给它的内容定义的?是的,但不是在编译时明显。
想想一会儿。当你声明一个视图的模型类型,它是所以你得到视图的intellisense。这意味着类型必须在编译时确定。但问题问,我们可以确定从运行时给它的东西的类型。当然,但不是强类型保留。
你如何获得Intellisense一个你甚至不知道的类型?控制器最终可以在运行时将任何类型传递给视图。我们甚至不能分析代码和猜测,因为动作过滤器可以改变传递给视图的对象,我们知道。
我希望澄清的答案,没有混淆它更多。