在这种情况下我会用什么(asp.net mvc 3显示模板)

时间:2011-04-03 19:17:22

标签: c# asp.net-mvc asp.net-mvc-3 display-templates

我有类似的东西

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>   

那么我怎样才能做到这一点?

2 个答案:

答案 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)