我正在尝试为购物篮商品列表制作自定义模板。我需要一些不同的模板,因为我有不同的方式来显示项目,具体取决于它是在网页上还是在邮件中。现在我的问题是,当我使用默认名称时,它可以完美地运行。
@Html.DisplayFor(b => b.Items)
但是当我尝试添加模板名称时,我得到了一个预测,我的模板需要是一个列表类型IEnumerable而不是BasketItem。
@Html.DisplayFor(i => basket.Items, "CustomerItemBaseList")
我的错误所在的任何想法,或者为什么不可能被欣赏。感谢。
答案 0 :(得分:22)
不幸的是,这是模板助手的限制。如果为集合属性指定模板名称,则模板将不再自动应用于集合的每个项目。可能的解决方法:
@for (int i = 0; i < Model.Items.Length; i++)
{
@Html.DisplayFor(x => x.Items[i], "CustomerItemBaseList")
}
答案 1 :(得分:2)
public static class DisplayTextListExtension
{
public static MvcHtmlString DisplayForList<TModel>(this HtmlHelper<TModel> html, IEnumerable<string> model, string templateName)
{
var tempResult = new StringBuilder();
foreach (var item in model)
{
tempResult.Append(html.DisplayFor(m => item, templateName));
}
return MvcHtmlString.Create(tempResult.ToString());
}
}
然后实际用法如下:
@Html.DisplayForList(Model.Organizations, "infoBtn")
答案 2 :(得分:1)
我喜欢Dan的答案,但只是略微调整,因为它适用于任何IEnumerable:
(var1->var2)->name=(some value)
当然:
using System.Collections;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;
namespace YourProject.Whatever
{
public static class DisplayExtensions
{
public static MvcHtmlString DisplayForIEnumerable<TModel>(this HtmlHelper<TModel> html, IEnumerable model, string templateName)
{
var tempResult = new StringBuilder();
foreach (var item in model)
{
var item1 = item;
tempResult.Append(html.DisplayFor(m => item1, templateName));
}
return MvcHtmlString.Create(tempResult.ToString());
}
}
}
答案 3 :(得分:0)
我建议使用DisplayFor
方法的 additionalViewData 参数,使用@DisplayFor(b=>b.Items, new { layout="row" })
方法的 additionalViewData 参数,使用其他解决方案对异构对象列表(即BasketItem子类)更有用,例如:
IEnumerable<T>
以这种方式帮助程序与ViewData
一起工作正常,调用每个项目(T的子类)相对的 DisplayTemplate ,并将 additionalViewData 值传递给它@model MyProject.BasketItem // or BasketItem subclass
@{
string layout = ViewData["layout"] as string ?? "default";
switch(layout)
{
case "row":
<div class="row">
...
</div>
break;
// other layouts
...
default: // strongly recommended a default case
<div class="default-view>
...
</div>
break;
}
}
字典。
模板可以为不同的布局值输出不同的代码。
在上面的示例中,名为View \ Shared \ DisplayTemplates \ BasketItem 的模板(或子类的名称)应如下所示:
PUT http://<user's website>/index.php/wurrd/clientinterface/operator/login
{"username":"apple", "password":"dove", "clientid":"AABBB-CCCCC-DEFGHIJ", "deviceuuid":"aaa-uuu-isdi"}
强烈建议始终提供默认代码。
我希望这个建议有所帮助。