开发者

Nested Display Templates In Razor

开发者 https://www.devze.com 2023-02-16 01:13 出处:网络
I\'m currently getting to grips with ASP.Net MVC 3 and the Razor templating engine, but I\'ve come across an issue that I can\'t quite get to grips with - so over to the StackOverflow community to hel

I'm currently getting to grips with ASP.Net MVC 3 and the Razor templating engine, but I've come across an issue that I can't quite get to grips with - so over to the StackOverflow community to help!

Let's say that I have a View Model hierarchy that looks like this:

public class Foo {
    public string FooTitle { get; set; }
    [UIHint("BarList")]
    public IList<Bar> BarList { get; set; }
}

public class Bar {
    public string BarTitle { get; set; }
}

all fairly simple I'm sure you'll agree. To go with this View Model I have the following:

~/Views开发者_如何转开发/Home/Index.cshtml

@model Foo

<h1>@Model.FooTitle</h1>
@Html.DisplayFor(m => m.BarList)

~/Views/Home/DisplayTemplates/BarList.cshtml

@model IEnumerable<Bar>

<div class="bar-list">
@Html.DisplayForModel()
</div>

~/Views/Home/DisplayTemplates/Bar.cshtml

@model Bar

<p>@Model.BarTitle</p>

I would expect to find the contents of Bar.cshtml to be displayed when I execute my View, but the rendering doesn't seem to nest further that BarList.cshtml

What am I doing wrong here?


You don't need the intermediary BarList.cshtml template nor UIHint if you follow the conventions:

public class Foo {
    public string FooTitle { get; set; }
    public IList<Bar> BarList { get; set; }
}

public class Bar {
    public string BarTitle { get; set; }
}

View (~/Views/Home/Index.cshtml):

@model Foo
<h1>@Model.FooTitle</h1>
<div class="bar-list">
    @Html.DisplayFor(m => m.BarList)
</div>

Display template (~/Views/Home/DisplayTemplates/Bar.cshtml):

@model Bar
<p>@Model.BarTitle</p>

and the Bar.cshtml template will automatically be rendered for each element of the BarList collection.


I doubt you still have this issue but this is the correct solution

~/Views/Home/DisplayTemplates/BarList.cshtml

@model IEnumerable<Bar>
<div class="bar-list">
@foreach (var bar in Model) {
    @Html.DisplayFor(c => bar)
}
</div>


Move all these Display Templates to: ~/Views/Shared/DisplayTemplates/

Edit: What about iterating through each bar?

@model IEnumerable<Bar>
<div class="bar-list">
@foreach (var bar in Model) {
    @Html.DisplayForModel(bar)
}
</div>
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号