1

(为标题道歉..很难确定)

我有一种情况,控制器将构建一个列表,其中将包含一组从抽象基类派生的 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
{

}

..这是视图...

@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 行空格

如您所见,它似乎将整个事物渲染了两次。我已经放置了一个断点并单步执行索引视图,绝对不会重复循环。有人看到我错过了什么吗?

4

1 回答 1

1

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

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

于 2015-12-08T09:00:53.907 回答