当前位置:  开发笔记 > 后端 > 正文

我可以将匿名类型传递给我的ASP.NET MVC视图吗?

如何解决《我可以将匿名类型传递给我的ASP.NETMVC视图吗?》经验,为你挑选了3个好方法。

我刚刚开始使用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由从控制器传递的内容定义,或者我是否必须定义从我的查询填充的具体类型?



1> Haacked..:

你能把它传递给视图吗?是的,但您的视图不会被强类型化.但帮手会工作.例如:

public ActionResult Foo() {
  return View(new {Something="Hey, it worked!"});
}

//Using a normal ViewPage

<%= Html.TextBox("Something") %>

那个文本框应该呈现"嘿,它有效!" 作为价值.

那么你可以定义一个视图,其中T是由从控制器传递给它的内容定义的吗?是的,但显然不是在编译时.

想一想.当您为视图声明模型类型时,您将获得视图的智能感知.这意味着必须在编译时确定类型.但问题是,我们可以在运行时从给定的东西中确定类型.当然,但没有强大的打字保留.

你怎么会得到一个你还不知道的智能感知器?控制器最终可以在运行时将任何类型传递给视图.我们甚至无法分析代码和猜测,因为动作过滤器可以改变传递给视图的对象.

我希望能够澄清答案而不会更多地模糊它.:)


它没有回答这个问题!令人惊讶的是,它适用于文本框,但如果我只想渲染此值,我该怎么做?<%= Model.Something%>不起作用,你将得到'object'不包含'Something'异常的定义.

2> Lasse Skinds..:

可以将匿名类型传递给视图,只需记住将模型转换为动态.

你可以这样做:

return View(new { 
    MyItem = "Hello", 
    SomethingElse = 42, 
    Third = new MyClass(42, "Yes") })

在视图的顶部,您可以这样做(在这里使用剃刀)

@{
    string myItem = (dynamic)Model.MyItem;
    int somethingElse = (dynamic)Model.SomethingElse;
    MyClass third = (dynamic)Model.Third;
}

或者您可以像这样从ViewData中转换它们:

@{
    var myItem = ViewData.Eval("MyItem") as string
    var somethingElse = ViewData.Eval("SomethingElse") as int?
    var third = ViewData.Eval("Third") as MyClass 
}


好吧,你的第一个例子不起作用.至少不在MVC3中.惊喜!首先,在无类型视图中,`Model`已经是`dynamic`,不需要强制转换它.第二,使用你的代码,我得到一个带有消息"*'object'的`RuntimeBinderException`不包含MyItem*的定义".有任何想法吗?
我刚刚解释了一下.事实证明,匿名类型是内部的,这意味着在定义程序集之外无法看到它们的属性.看看这里:http://www.gregshackles.com/2010/09/anonymous-view-models-in-asp-net-mvc-using-dynamics/

3> Adaptabi..:

在.NET 4.0上,匿名类型可以很容易地转换为ExpandoObjects,因此所有问题都可以通过转换本身的开销来解决.看看这里

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有