2017-04-03 213 views
0

我试图解决错误'列表ActiveOrder02不包含客户端的定义',当我将鼠标放在'.Client'上 @ Html.DisplayNameFor(model = >在下面查看model.ActiveOrders02.Client) :ASP.NET MVC查看期问题

@model MVCDemo2.ViewModels.Order02VM 

<table class="table"> 
<tr><th>@Html.DisplayNameFor(model => model.ActiveOrders02.Client)</th></tr> 

@foreach (var item in Model.ActiveOrders02) 
{ 
    <tr> 
     <td>@Html.DisplayFor(modelItem => item.Client)</td> 
    </tr> 
} 

有关的信息在这里是控制器和视图模型:

using MVCDemo2.Models; 
using MVCDemo2.ViewModels; 
using System.Linq; 
using System.Web.Mvc; 

namespace MVCDemo2.Controllers 
{ 
public class Order02Controller : Controller 
{ 
    private InventoryContainer db02 = new InventoryContainer(); 
    // GET: Order02 
    public ActionResult Index() 
    { 
     //Create instance of the (View)Model 
     var o = new Order02VM(); 
     //Retrieves DATA from the DB 
     var resultSet02 = db02.SampleDbTable; 
     // Push the retrieved DATA into the (View)Model 
     o.ActiveOrders02 = resultSet02.Select(x => new ActiveOrder02 
     { 
      ID = x.tableId, 
      Client = x.tableClient 
     }).ToList(); 
//EDIT caused by answer of @David 
     return View(o); 
//IT WAS:   return View(o.ActiveOrders02.ToList()); 
    } 
} 
} 

在这里如下视图模型:

using System.Collections.Generic; 

namespace MVCDemo2.ViewModels 
{ 
public class Order02VM 
{ 
    public List<ActiveOrder02> ActiveOrders02 { get; set; } 
} 

public class ActiveOrder02 
{ 
    public decimal ID { get; set; } 
    public string Client { get; set; } 
} 
} 

编辑:我是什么之后,通过DisplayNameFor从SampleDbTable目前列tableClient的名称列客户端中的索引视图的标题。

谢谢!

+0

想想为什么'model.ActiveOrders02.Client'不起作用。它在C#中不起作用,因此它在Razor中不起作用。一个'List '没有一个名为'Client'的属性。 “客户”属性位于列表中的项目中,而不是列表本身。所以目前还不清楚你想要做什么。如果'Client'属性在'Order02VM'上更有意义,那么将它移动到那里。或者它在正确的位置定义,然后改变你如何访问它。例如'model.ActiveOrders02.First()。Client'。 – mason

+0

感谢您的评论!, 由DisplayNameFor(model => model.ActiveOrders02.Client 我试图通过从SampleDbTable的列的标题中获取此列的标题以设置此列的标题。 – Angel

回答

2

因为model.ActiveOrders02List<ActiveOrder02>类型,而不是ActiveOrder02类型。

它看起来像你只是想获得属性的显示元数据,而不是特定实例的值。有一个有些直观的方式来做到这一点:

@Html.DisplayNameFor(model => model.ActiveOrders02.First().Client) 

说明列表中使用.First()。有人可能直觉认为这将是容易出错的,因为如果列表为空,则会引发异常。 但是,ASP.NET实际上不会使用它遍历列表。该表达式被框架用来识别框架将反映的属性以获取关于该属性的元数据。

大多数的情况下,把类似的东西放在列表中将要求列表永远不会是空的。然而,在这种特殊情况下,它应该可以正常工作。

+0

谢谢,大卫! 作为您的建议得到的结果是以下错误: 传递到字典中的模型项目类型为'System.Collections.Generic.List'1 [MVCDemo2.ViewModels.ActiveOrder02]',但此字典需要一个模型项目的类型'MVCDemo2.ViewModels.Order02VM'。 我还不清楚如何从SampleDbTable – Angel

+0

@Angel的相应列(tableClient)的名称中获取列的名称:这是一个单独的问题。你将视图的模型类型声明为:'@model MVCDemo2.ViewModels.Order02VM',但是你传递它:'return View(o.ActiveOrders02.ToList());'你是否只是把它传递给对象本身? '返回视图(o);'这似乎是视图代码所期待的。你必须给视图一个它期望的类型的实例。因此,要么更改控制器以提供该类型,要么更改视图以期望您提供的类型。 – David

+0

我的意思是返回查看(o),但尝试不同的选项,我搞砸了,忘了纠正它。 当我改变它返回视图(o)和在视图'模型=> model.ActiveOrders02.First()。客户'中使用没有这样的错误,结果是'客户端',而我所追求的是'tableClient' 谢谢! – Angel

2

从您的代码中可以清楚地看到ActiveOrders02是ActiveOrder02类型的对象列表。 客户端是ActiveOrders02中元素(ActiveOrder02)中的属性。如果你想在ActiveOrders02的第一个项目了客户价值,你可以去

@Html.DisplayNameFor(model => model.ActiveOrders02[0].Client)

当然,你需要检查是否ActiveOrders02为空或不这样做之前。

+0

您的答案对于了解模型 - 视图 - 控制器世界中哪里出错是非常有帮助的:)我很快就会赞扬它。谢谢! – Angel

1

您指示认为@modelMVCDemo2.ViewModels.Order02VM,但在控制器设置o.ActiveOrders02List<MVCDemo2.ViewModels.Order02VM>

o.ActiveOrders02 = resultSet02.Select(x => new ActiveOrder02 
{ 
    ID = x.tableId, 
    Client = x.tableClient 
}).ToList(); // <-- 

然后你return View(o.ActiveOrders02.ToList());,实质上调用.ToList()o.ActiveOrders02,这已经是一个List<MVCDemo2.ViewModels.Order02VM>

所以,你可以:

  • 回报Order02VM到视图中的单个实例,而不是一个项目的列表,或...
  • 回报列表视图,设置视图的@modelList<MVCDemo2.ViewModels.Order02VM>并从列表中取第一个Order02VM实例(使用.First(),列表索引0等)并从那里开始。