MVC 3多个DisplayFor-Templates

时间:2011-04-29 15:24:11

标签: asp.net-mvc display-templates

我正在尝试为购物篮商品列表制作自定义模板。我需要一些不同的模板,因为我有不同的方式来显示项目,具体取决于它是在网页上还是在邮件中。现在我的问题是,当我使用默认名称时,它可以完美地运行。

@Html.DisplayFor(b => b.Items)

但是当我尝试添加模板名称时,我得到了一个预测,我的模板需要是一个列表类型IEnumerable而不是BasketItem。

@Html.DisplayFor(i => basket.Items, "CustomerItemBaseList")

我的错误所在的任何想法,或者为什么不可能被欣赏。感谢。

4 个答案:

答案 0 :(得分:22)

不幸的是,这是模板助手的限制。如果为集合属性指定模板名称,则模板将不再自动应用于集合的每个项目。可能的解决方法:

@for (int i = 0; i < Model.Items.Length; i++)
{
    @Html.DisplayFor(x => x.Items[i], "CustomerItemBaseList")
}

答案 1 :(得分:2)

达林,这是一个好主意。我很懒,所以我想更进一步,做一个真正帮助包裹它的人。我也取出了lambda表达式来简化它,但你可以轻松地将该功能添加回来。

    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"}

强烈建议始终提供默认代码。

我希望这个建议有所帮助。