使用MVC 3和Razor视图引擎.我有这个观点:
@model dynamic
@{
var products = (List<ListItemBaseModel>)Model.Products;
var threshold = (int)(Model.Threshold ?? 1);
var id = Guid.NewGuid().ToString();
}
Run Code Online (Sandbox Code Playgroud)
使用此代码从另一个视图调用它:
@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })
Run Code Online (Sandbox Code Playgroud)
在两个视图中,当我调试它们并观看模型时,它似乎包含正确的对象.当我执行代码时,我在"var products ="行上收到错误说:
'object'不包含'Products'的定义
任何人都可以向我解释为什么我会收到这个错误?再次,当我在调试模式下观察Model对象时,它看起来很好(具有2个属性:Products和Threshold)
我做错了什么,或者以下代码真的不可能?
dynamic x = new ExpandoObject { Foo = 12, Bar = "twelve" };
Run Code Online (Sandbox Code Playgroud)
如果这确实不可能,是否有另一种单行方式来实例化具有两个属性的ExpandoObject?
为什么C#团队会选择禁止使用与常规对象,匿名对象和枚举/列表相同的初始化语法?
更新
我问过这个问题是因为我试图向珍珠爱好者展示C#的酷炫新动态特性,但后来由于无法做到我认为是一个逻辑实例化的东西而陷入困境ExpandoObject.感谢Hans Passant的回答,我意识到这ExpandoObject是错误的工具.我的真正目标是使用C#的动态功能从方法返回两个命名值.汉斯指出,dynamic关键字对此非常完美.我没有需要一个ExpandoObject完成它的所有开销.
因此,如果您想从方法中返回一对命名值,并且您不关心类型安全性,智能感知,重构或性能,这可以很好地工作:
public dynamic CreateFooBar()
{
return new { Foo = 42, Bar = "Hello" };
}
Run Code Online (Sandbox Code Playgroud)
用法:
dynamic fooBar = CreateFooBar();
var foo = fooBar.Foo;
var bar = fooBar.Bar;
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用ASP.NET MVC,因为它处于测试阶段.在我的代码中,我正在运行一个简单的LINQ to SQL查询来获取结果列表并将其传递给我的视图.这种事:
var ords = from o in db.Orders
where o.OrderDate == DateTime.Today
select o;
return View(ords);
Run Code Online (Sandbox Code Playgroud)
但是,在我的视图中,我意识到我需要访问每个订单的客户名称.我开始使用,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);
Run Code Online (Sandbox Code Playgroud)
除了现在我的"ords"变量是一个匿名类型的IEnumerable.
是否可以以这样的方式声明ASP.NET MVC视图:它接受IEnumerable作为其视图数据,其中T由从控制器传递的内容定义,或者我是否必须定义从我的查询填充的具体类型?
我曾经遇到过这个问题并且没有解决它.我有一个列表(在MVC3控制器中生成):
ViewBag.Languages = db.Languages
.Select(x => new { x.Name, x.EnglishName, x.Id })
.ToList();
Run Code Online (Sandbox Code Playgroud)
在我的页面(Razor)我尝试迭代它:
foreach (var o in ViewBag.Languages)
{
string img = "Lang/" + o.EnglishName + ".png";
@* work *@
}
Run Code Online (Sandbox Code Playgroud)
但引用o.EnglishName失败并出现错误:
'object'不包含'EnglishName'的定义
虽然奇怪的是,如果我输入立即窗口(调试时):
Run Code Online (Sandbox Code Playgroud)o { Name = ????????, EnglishName = Tibetan, Id = 31 } EnglishName: "Tibetan" Id: 31 Name: "????????"
显然,这个领域就在那里.我的问题在这里是什么?
我想使用razor模板创建一个视图,但我不想为模型编写一个类,因为在许多视图中我将有许多查询将返回不同的模型.
例如,我有一个linq查询:
from p in db.Articles.Where(p => p.user_id == 2)
select new
{
p.article_id,
p.title,
p.date,
p.category,
/* Additional parameters which arent in Article model */
};
Run Code Online (Sandbox Code Playgroud)
我需要为此查询编写一个View.此查询返回文章.
现在我不知道应该如何看起来像模型定义.
我试着用这个定义:
@model System.Collections.IEnumerable
Run Code Online (Sandbox Code Playgroud)
但后来我有一个错误而不是文件在对象类型中不存在:
*CS1061:'object'不包含'addition_field'的定义,并且没有扩展方法'addition_field'接受类型'object'的第一个参数可以找到*
这是我的模型,我不想写下一个模型.当然
这可能吗?这是我正在尝试的:
public ActionResult Index()
{
dynamic p = new { Name = "Test", Phone = "111-2222" };
return View(p);
}
Run Code Online (Sandbox Code Playgroud)
然后我的视图继承System.Web.Mvc.ViewPage<dynamic>并尝试打印出Model.Name.
我收到一个错误:'<> f__AnonymousType1.Name'由于其保护级别而无法访问
所以基本上,我正在尝试做的是不可能的?为什么或者为什么不?
更新:这是我的看法
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ...>
<%=Model.Name%>
<%=Model.Phone%>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
View构造函数内置于框架中.
我有一个Contact对象列表,我只想要一个属性的子集.所以我使用LINQ投影来创建一个匿名列表,然后将其传递给局部视图.但是当我在局部视图中使用该列表时,编译器说它没有那些属性.我尝试了最简单的情况如下,但我仍然没有机会在局部视图中使用匿名对象或列表.
var model = new { FirstName = "Saeed", LastName = "Neamati" };
return PartialView(model);
Run Code Online (Sandbox Code Playgroud)
在局部视图中,我有:
<h1>Your name is @Model.FirstName @Model.LastName<h1>
Run Code Online (Sandbox Code Playgroud)
但它说@Model没有FirstName和LastName属性.这有什么不对?当我使用@Model时,此字符串将在浏览器中呈现:
{ Title = "Saeed" }
Run Code Online (Sandbox Code Playgroud) asp.net-mvc anonymous-types viewmodel partialviews asp.net-mvc-3
我想将两个值从控制器动作传递到asp.net MVC 3 Razor视图.我在行动方法中这样做:
var model = new { reportid = rid, refno = refernumber};
return View(model );
Run Code Online (Sandbox Code Playgroud)
但当我尝试在这样的视图中访问它:
@Model.reportid
Run Code Online (Sandbox Code Playgroud)
我知道,对象不包含属性reportid
如何在不使用viewbag的情况下传递多个值?
我试图在我的MVC应用程序中使用动态类型模型.我有以下代码:在控制器中:
var model = new { Name = "test name", Family = "m" };
return this.View(model);
Run Code Online (Sandbox Code Playgroud)
在我看来,我有:
@model dynamic
@if(Model!=null)
{
<p> @Html.Raw(Model.Name) </p>
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我收到以下错误:
'object' does not contain a definition for 'Name' (System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误?在调试期间,如果我将光标放在@Model上,我可以看到它有两个名为Name和Family的属性.
我正在尝试将动态结果传递给View from Controller,方法ShowColor返回动态结果.在视图中我尝试循环收集,但我收到错误
'object'不包含'ColorID'的定义.
我在Controller和View中有以下代码
public class myColor
{
public int ID { get; set; }
public string Name { get; set; }
public string Like { get; set; }
}
public dynamic ShowColor()
{
IList<myColor> color = new List<myColor>();
color.Add(new myColor { ID = 1, Name = "Red", Like = "***" });
color.Add(new myColor { ID = 2, Name = "Green", Like = "*****" });
color.Add(new myColor { ID = 3, Name = "Blue", Like = "**" …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×8
dynamic ×4
razor ×4
c# ×3
c#-4.0 ×1
partialviews ×1
typing ×1
view ×1
viewmodel ×1
viewpage ×1