我有类似的东西
public class ViewModel1
{
// some properties here
public List<ViewModel2> ViewModel2 {get; set;}
}
public class ViewModel2
{
public string A {get; set;}
public string B {get; set;}
}
// view
<table>
<thead>
<tr> a </tr>
<tr> b </tr>
</thead>
<tbody>
// want to use a display template to render table row and cells so I don't need to use for loop
</tbody>
</table>
我尝试使用“@Html.DisplayForModel()
”但我似乎采用了视图的viewModel(所以在我的例子中是ViewModel1)
我需要使用ViewModel2,但我没有看到传递ViewModel2(模型对象)的任何选项。
然后我尝试了
@Html.DisplayFor(x => x.ViewModel2)
这样做不好,它只是像第一个属性值一样打印出来,甚至从未制作过任何单元格。
这基本上是我的显示模板
@model ViewModel2
<tr>
<td>@Model.A</td>
<td>@Model.B</td>
</tr>
那么我怎样才能做到这一点?
答案 0 :(得分:1)
试试这样:
<table>
<thead>
<tr>
<th>a</th>
<th>b</th>
</tr>
</thead>
<tbody>
@Html.DisplayFor(x => x.ViewModel2)
</tbody>
</table>
然后在~/Views/Shared/DisplayTemplates/ViewModel2.cshtml
内:
@model ViewModel2
<tr>
<td>@Model.A</td>
<td>@Model.B</td>
</tr>
注意显示模板的名称和位置。如果您希望这一点有效,请务必遵守此惯例。
答案 1 :(得分:0)
如果您真的不想在“主”模板中使用foreach,则可以使用UIHint标记您的属性
public class ViewModel1
{
// some properties here
[UIHint("ListOfViewModel2")]
public List<ViewModel2> ViewModel2 {get; set;}
}
然后,在DisplayTemplates \ ListOfViewModel2.ascx中,你把你的foreach
@model IList<ViewModel2>
foreach( var m in Model )
{
<tr>@Html.DisplayFor(x => m)</tr>
}
不要更改ViewModel2的DisplayModel,在您查看中,您可以调用
@Html.DisplayFor(x => x.ViewModel2)