【问题标题】:what would I use in this situation(asp.net mvc 3 display templates)在这种情况下我会使用什么(asp.net mvc 3 显示模板)
【发布时间】:2011-04-03 19:17:22
【问题描述】:

我有这样的事情

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>   

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

【问题讨论】:

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


    【解决方案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> 
    

    注意显示模板的名称和位置。如果您希望这样做,请务必遵守此约定。

    【讨论】:

    • 为什么要进入共享文件夹?就我而言,它不是共享模板。
    • @chobo2,没必要,~/Views/SomeControllerName/EditorTemplates/ViewModel2.cshtml也可以。
    • 这就是我拥有它的地方,除了在 DisplayTemplates not Edit 中。不过他们都有相同的名字。
    • @chobo2,哎呀,确实是 DisplayTemplates。
    【解决方案2】:

    如果你真的不想在你的“主”模板中使用 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)
    

    【讨论】:

    • @mathieu - 并不是我真的不想在我的 main 中放置一个 foreach 循环(如果我不需要这样做,那很好)。更重要的是,这样做可以解决“名称”属性的问题,否则我必须制作一个计数器以确保名称不同。所以你知道一个看起来不错的方法然后我可能会走那条路。我会调查你有什么,但我不明白“ListOfViewModel2”是什么。
    • 模板文件名。默认情况下,使用属性类型名称。当您具有“IList”之类的属性时,您不能将文件命名为“IList.ascx”。所以你在属性上放了一个 UIHint 来告诉 ASP.NET MVC 使用哪个显示模板。
    • @mathieu - 好的,我将 UiHint 与我的模板文件名放在一起。我放了@Html.DisplayForModel() 并将我的模板更改为有一个foreach 循环。但是它仍然使用错误的视图模型。它仍然使用 ViewModel1 作为 DisplayForModel 模板。它没有使用我的 ViweModel2 模板
    • @Html.DisplayFor(x => x.ViewModel2)
    • @mathieu - 也试过了,但所有的 id 和名称都有相同的名称,这不是有效的 html。
    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2013-04-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多