(标题道歉......难以确定)
我有一种情况,控制器将构建一个List,它将包含一组从抽象基类派生的ViewModel。然后我使用显示模板来适当地呈现内容,但是当我导航到url时,它似乎将整个内容呈现两次。这是我的代码
public abstract class AbstractItemViewModel
{
}
public class TypeAViewModel : AbstractItemViewModel
{
public int ID { get; set; }
public string Title { get; set; }
public string Body { get; set; }
}
public class TypeBViewModel : AbstractItemViewModel
{
public string Title { get; set; }
public List<string> Items { get; set; }
}
然后我的控制器构建了一个测试用例。
public class HomeController : BaseController
{
// GET: Home
public ActionResult Index()
{
List<AbstractItemViewModel> items = new List<AbstractItemViewModel>();
items.Add(new TypeAViewModel() { ID = 1, Title = "Test A", Body = "This is some body content." });
items.Add(new TypeBViewModel() { Title = "Test B", Items = new List<string>() { "Line 1", "Line 2", "Line 3" } });
return View(items);
}
}
...为了完整性,这里是基本控制器类(没什么特别的)..
public class BaseController : Controller
{
}
..这里是View ...
@using xxx.ViewModels
@model List<AbstractItemViewModel>
@{
ViewBag.Title = "Home";
}
<h1>@Model.Count()</h1>
<div class="container">
<div class="row">
@foreach (AbstractItemViewModel item in Model)
{
<div class="col-xs-12">
@Html.DisplayForModel(item)
</div>
<p>space</p>
}
</div>
</div>
..和2个显示模板 TypeAViewModel.cshtml
@using xxx.ViewModels
@model TypeAViewModel
<h2>@Model.Title (@Model.ID)</h2>
<p>@Model.Body</p>
..和...... TypeBViewModel.cshtml
@using xxx.ViewModels
@model TypeBViewModel
<h2>@Model.Title</h2>
<ul>
@foreach (string s in Model.Items)
{
<li>@s</li>
}
</ul>
作为输出我得到了。
2
测试A(1)这是一些正文内容。
测试B线1线2线3空间
测试A(1)这是一些正文内容。
测试B线1线2线3空间
正如你所看到的那样,似乎整个事情都呈现了两次。我已经放置了断点并逐步完成了索引视图,但绝对不会重复循环。有谁看到我错过了什么?
答案 0 :(得分:1)
您应该使用DisplayFor
Html帮助器而不是DisplayForModel
,因为DisplayForModel
会发送您的整个模型(在这种情况下是传入模型的完整列表 - AbstractItemViewModel
的后代; item
实际上只是传入模型的附加数据)。实际上对于foreach中的每个项目,完整的模型都会传递给您的视图;例如如果你的列表中有3个模型,它们将被渲染3次(如果是4次,那么4次等)。
为此,要使用此帮助程序:在foreach语句中使用此@Html.DisplayFor(model => item)
而不是DisplayForModel
。