相关疑难解决方法(0)

MVC Razor动态模型,'object'不包含'PropertyName'的定义

使用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)

razor asp.net-mvc-3

104
推荐指数
5
解决办法
8万
查看次数

为什么我不能这样做:dynamic x = new ExpandoObject {Foo = 12,Bar ="12"}}

我做错了什么,或者以下代码真的不可能?

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)

c# dynamic expandoobject

60
推荐指数
4
解决办法
2万
查看次数

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

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

asp.net-mvc

43
推荐指数
3
解决办法
4万
查看次数

'object'不包含'X'的定义

我曾经遇到过这个问题并且没有解决它.我有一个列表(在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'的定义

虽然奇怪的是,如果我输入立即窗口(调试时):

o
{ Name = ????????, EnglishName = Tibetan, Id = 31 }
    EnglishName: "Tibetan"
    Id: 31
    Name: "????????"
Run Code Online (Sandbox Code Playgroud)

显然,这个领域就在那里.我的问题在这里是什么?

c# asp.net-mvc razor

37
推荐指数
1
解决办法
4万
查看次数

具有匿名类型模型类的剃刀视图.有可能的?

我想使用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'的第一个参数可以找到*

这是我的模型,我不想写下一个模型.当然

c# asp.net-mvc anonymous-types razor asp.net-mvc-3

19
推荐指数
2
解决办法
2万
查看次数

动态类型的ViewPage

这可能吗?这是我正在尝试的:

    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构造函数内置于框架中.

asp.net-mvc typing dynamic viewpage c#-4.0

12
推荐指数
2
解决办法
8556
查看次数

如何在ASP.NET MVC局部视图中使用匿名列表作为模型?

我有一个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

10
推荐指数
1
解决办法
5366
查看次数

传递匿名对象进行查看

我想将两个值从控制器动作传递到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的情况下传递多个值?

asp.net-mvc asp.net-mvc-3

8
推荐指数
1
解决办法
7876
查看次数

mvc视图中的动态类型

可能重复:
Razor中的动态匿名类型导致RuntimeBinderException

我试图在我的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的属性.

asp.net-mvc dynamic anonymous-types

6
推荐指数
1
解决办法
7215
查看次数

在MVC5 Razor View中传递动态模型

我正在尝试将动态结果传递给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 view dynamic razor asp.net-mvc-5

6
推荐指数
1
解决办法
2万
查看次数