gpt4 book ai didi

c# - ASP.NET MVC 3 : Output specific view for concrete implementation

转载 作者:行者123 更新时间:2023-12-03 19:22:14 24 4
gpt4 key购买 nike

我有一个基本类型的 IEnumerable 作为我的模型。

我需要根据具体类型在列表中显示不同的 HTML 部分。

因此,生成的列表可能与 HTML 中的类似:

<ul>
<li class="points">Points - Item 1 - 10 points <a href="#">Remove</a></li>
<li class="media">Media - Item 2 - your_uploaded_image.jpg <a href="#">Remove</a></li>
<li class="content">Content - Item 3 <a href="#">Remove</a></li>
</ul>

我可能稍后会添加另一种类型,因此像下面这样的解决方案并不是我真正想要的。

@foreach(var item in Model)
{
if(item is PointImpl)
{
var pointItem = item as PointImpl;
<li class="points">Points - @pointItem.Name - @pointItem.Points points <a href="#">Remove</a></li>
}
else if(item is MediaImpl)
{
var mediaItem = item as MediaImpl;
<li class="media">Media - @mediaItem.Name - @mediaItem.FileName <a href="#">Remove</a></li>
}
/*
More implementations
*/
}

我已经查看了模型元数据模板提示,但这并没有真正帮助,因为我的模型是 IEnumerable..

我正在考虑使用一个自定义的 Html Helper 查看具体类型上的属性,但认为可能有一种内置的方法可以做到这一点?

最佳答案

只需使用显示模板即可代替丑陋的foreach:

@model IEnumerable<SomeBaseViewModel>
<ul>
@Html.DisplayForModel()
</ul>

然后为所有子类型定义显示模板。例如:

~/Views/Shared/DisplayTemplates/PointImpl.cshtml:

@model PointImpl
<li class="points">
Points - @Model.Name - @Model.Points points
<a href="#">Remove</a>
</li>

和:~/Views/Shared/DisplayTemplates/MediaImpl.cshtml:

@model MediaImpl
<li class="media">
Media - @Model.Name - @Model.FileName
<a href="#">Remove</a>
</li>

看,没有更多的 if,没有更多的循环,没有更多的变量。一切都按惯例进行(模板必须位于 ~/Views/Shared/DisplayTemplates~/Views/SomeController/DisplayTemplates 文件夹中,并且应命名为具体类型 - PointImpl.cshtmlMediaImpl.cshtml、...)。根据具体类型,将渲染相应的显示模板,并且这会自动针对主模型集合的每个元素进行渲染。

关于c# - ASP.NET MVC 3 : Output specific view for concrete implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6495295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com