迭代从AbstractViewModel和DisplayTemplates派生的ViewModel集合呈现两个DisplayTemplates

时间:2015-12-08 08:02:11

标签: c# model-view-controller display-templates

(标题道歉......难以确定)

我有一种情况,控制器将构建一个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空间

正如你所看到的那样,似乎整个事情都呈现了两次。我已经放置了断点并逐步完成了索引视图,但绝对不会重复循环。有谁看到我错过了什么?

1 个答案:

答案 0 :(得分:1)

您应该使用DisplayFor Html帮助器而不是DisplayForModel,因为DisplayForModel会发送您的整个模型(在这种情况下是传入模型的完整列表 - AbstractItemViewModel的后代; item实际上只是传入模型的附加数据)。实际上对于foreach中的每个项目,完整的模型都会传递给您的视图;例如如果你的列表中有3个模型,它们将被渲染3次(如果是4次,那么4次等)。

为此,要使用此帮助程序:在foreach语句中使用此@Html.DisplayFor(model => item)而不是DisplayForModel