Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 显示模板不接受列表<;对象>;从模型上的另一个属性?_Templates_Asp.net Mvc 4_Razor - Fatal编程技术网

Templates 显示模板不接受列表<;对象>;从模型上的另一个属性?

Templates 显示模板不接受列表<;对象>;从模型上的另一个属性?,templates,asp.net-mvc-4,razor,Templates,Asp.net Mvc 4,Razor,我有一个这样的模型: public class WorksheetViewModel() { public Worksheet Worksheet {get; set;} // ... more properties } public class Worksheet() { public List<LineItem> LineItems {get; set;} public Loan Loan {get; set; } //

我有一个这样的模型:

 public class WorksheetViewModel() {
     public Worksheet Worksheet {get; set;}
     // ... more properties
 }

 public class Worksheet() {
     public List<LineItem> LineItems {get; set;}
     public Loan Loan {get; set; }
     // ... more properties
 }

 public class LineItem() {
     // ... some properties
 }

 public class Loan() {
     public List<LoanField> Fields {get; set;}
     // ... more properties
 }

 public class LoanField() {
     // ... some properties
 }
 The model item passed into the dictionary is of type 
 'System.Collections.Generic.List`1[DataContracts.LoanField]',
 but this dictionary requires a model item of type
 'DataContracts.LoanField'.
我得到一个异常,如下所示:

 public class WorksheetViewModel() {
     public Worksheet Worksheet {get; set;}
     // ... more properties
 }

 public class Worksheet() {
     public List<LineItem> LineItems {get; set;}
     public Loan Loan {get; set; }
     // ... more properties
 }

 public class LineItem() {
     // ... some properties
 }

 public class Loan() {
     public List<LoanField> Fields {get; set;}
     // ... more properties
 }

 public class LoanField() {
     // ... some properties
 }
 The model item passed into the dictionary is of type 
 'System.Collections.Generic.List`1[DataContracts.LoanField]',
 but this dictionary requires a model item of type
 'DataContracts.LoanField'.
这两个集合的显示模板相似,因为它们在显示的模型上都有引用:

工作模板:

 @model DataContracts.LineItem
 @Html.Label(Model.ItemType.Description) : @Model.RecipientEmployee.FullName<br />
 @model DataContracts.LoanField
 @Html.Label(Model.FieldName) : @Model.FieldValue<br />
@model DataContracts.LineItem
@Html.Label(Model.ItemType.Description):@Model.RecipientEmployee.FullName
不工作模板:

 @model DataContracts.LineItem
 @Html.Label(Model.ItemType.Description) : @Model.RecipientEmployee.FullName<br />
 @model DataContracts.LoanField
 @Html.Label(Model.FieldName) : @Model.FieldValue<br />
@model DataContracts.LoanField
@Html.Label(Model.FieldName):@Model.FieldValue
由于第一个模板正确地接受LineItem对象列表,因此第二个模板的行为似乎与此相同,但在本例中显然不是这样


有人知道模板为什么会抱怨列表吗?有没有办法绕过它?

在尝试了许多不太可能奏效的古怪技巧后,我决定尝试更改模板的名称。。。它成功了

问题是对公约最初的误解。当我第一次创建一个显示模板时,我将其命名为属性名称,该属性名称是为。。。在本例中为“字段”

愚蠢的我。。。我假设MVC足够聪明,可以使用@model来解析类型。当我看到可以将模板名作为Html.DisplayFor()中的参数之一传入时,我认为这一假设得到了证实


然而,正如大多数人现在可能猜到的那样,模板的名称必须与其显示的数据类型相同(与@model语句中明确说明的类型完全相同)。一旦我更改了模板的名称,一切正常。

在尝试了许多不太可能奏效的古怪技巧后,我决定尝试更改模板的名称。。。它成功了

问题是对公约最初的误解。当我第一次创建一个显示模板时,我将其命名为属性名称,该属性名称是为。。。在本例中为“字段”

愚蠢的我。。。我假设MVC足够聪明,可以使用@model来解析类型。当我看到可以将模板名作为Html.DisplayFor()中的参数之一传入时,我认为这一假设得到了证实


然而,正如大多数人现在可能猜到的那样,模板的名称必须与其显示的数据类型相同(与@model语句中明确说明的类型完全相同)。一旦我更改了模板的名称,一切都正常。

这可能是因为对象的嵌套级别比另一个列表的嵌套级别高。这并不是说这对您的模型有效,只是为了尝试,如果您将
公共列表字段{get;set;}
属性移动到
工作表
,那么您可以将其呈现为
@Html.DisplayFor(m=>m.Worksheet.Fields)
。事实上,我认为我的上述假设可能也与您收到的错误有关。@渐近错误,我实在无法更改此处的模型。。。它的填充方式需要一些真正没有意义的重大改变。但是,我确实尝试嵌套我的显示模板(制作一个“Loan”模板,然后让Loan模板调用Fields模板),但也有相同的例外。@渐近错误,我在视图模型中添加了一个属性,用于从Loan对象返回LoanField列表。这没有效果,导致了同样的异常。我明白了。是的,我不是建议你永久性地改变它,只是暂时尝试一下,但听起来它比它的价值更麻烦。我确实在搜索中看到了一些方法,这些方法暗示了你所说的,你只是尝试了一下,但它们似乎没有希望,正如你所说的,它无论如何都不起作用。我在复杂对象上使用帮助程序时也遇到了问题,这似乎有点限制,但我会继续思考并四处查看,看看我们是否能解决这个问题。这可能是因为对象嵌套的级别比其他列表高一级。这并不是说这对您的模型有效,只是为了尝试,如果您将
公共列表字段{get;set;}
属性移动到
工作表
,那么您可以将其呈现为
@Html.DisplayFor(m=>m.Worksheet.Fields)
。事实上,我认为我的上述假设可能也与您收到的错误有关。@渐近错误,我实在无法更改此处的模型。。。它的填充方式需要一些真正没有意义的重大改变。但是,我确实尝试嵌套我的显示模板(制作一个“Loan”模板,然后让Loan模板调用Fields模板),但也有相同的例外。@渐近错误,我在视图模型中添加了一个属性,用于从Loan对象返回LoanField列表。这没有效果,导致了同样的异常。我明白了。是的,我不是建议你永久性地改变它,只是暂时尝试一下,但听起来它比它的价值更麻烦。我确实在搜索中看到了一些方法,这些方法暗示了你所说的,你只是尝试了一下,但它们似乎没有希望,正如你所说的,它无论如何都不起作用。我在复杂对象上使用帮助程序时也遇到了问题,这似乎是一种限制,但我会继续思考和环顾四周,看看我们是否能解决这个问题。