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列表。这没有效果,导致了同样的异常。我明白了。是的,我不是建议你永久性地改变它,只是暂时尝试一下,但听起来它比它的价值更麻烦。我确实在搜索中看到了一些方法,这些方法暗示了你所说的,你只是尝试了一下,但它们似乎没有希望,正如你所说的,它无论如何都不起作用。我在复杂对象上使用帮助程序时也遇到了问题,这似乎是一种限制,但我会继续思考和环顾四周,看看我们是否能解决这个问题。