mvc3 .net使用Html.DisplayFor显示视图模板

时间:2012-02-02 19:27:42

标签: .net asp.net-mvc-3 templates partial-views

我正在尝试使用模板。

我在使用Html.DisplayFor扩展程序时遇到了麻烦

我希望模板以只读方式显示所有数据。我相信HTML.DisplayFor可以做到这一点吗?

如果是这样,我将一个IEnumerable模型传递给视图:

@model IEnumerable<Tens.Models.Applicant>

@{   
    if (Model != null)
    {  
          @Html.DisplayForModel("ApplicationOutcome") 
    } 
 }

和我的模板:

@model IEnumerable<Tens.Models.Applicant>

@{

foreach(var item in Model)
{
    @Html.TextBox("forenames",item.Forenames)
    <br />
    @Html.TextBox("surname",item.Surname)
    <br />
    <text>----------------------------------</text>
    <br>
}
}

上面的代码工作正常(显示2条记录),但这意味着我将每个字段的readonly属性设置为true(有更多字段加载 - 这么乏味)。 我想要做的是使用Html.DisplayFor以只读方式显示这些数据,但我尝试了许多不同的方法,但无法使其工作。 任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

你的代码很奇怪。我就是这样做的。

WhateverView.cshtml

@model IEnumerable<Tens.Models.Applicant>  

@Html.DisplayForModel()

然后,在DisplayTemplate文件夹中:

Applicant.cshtml

@model Tens.Models.Applicant

@Html.LabelFor(m => Forenames)
@Html.DisplayFor(m => m.Forenames)

@Html.LabelFor(m => Surnames)
@Html.DisplayFor(m => m.Surnames)

等。使用这样的模板的关键是模型是一个集合,模板只适用于单个项目(注意模板中没有IEnumerable)。

答案 1 :(得分:0)

如果您想了解更多信息,请查看Brad Wilson的这篇文章。 http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html基本上您遇到的问题是由于在类型对象

的默认显示模板中进行了此检查
ViewData.TemplateInfo.TemplateDepth > 1

而不是打电话

@Html.DisplayForModel("ApplicationOutcome") 
在您的视图中

调用另一个模板。把

foreach(var item in Model)
{
    @Html.DisplayFor(m=>item)
}
在您的视图中直接

。这应该可以得到预期的结果。

以下是我的MVC控制器/模型/视图文件。你能试试这些吗?我没有任何特定于模型的模板文件,这是关键。将会发生什么是mvc将使用默认模板来渲染该对象。

DefaultController.cs(控制器)

public class DefaultController : Controller
{
    //
    // GET: /Default/

    public ActionResult Index()
    {
        var model = new List<Applicant>();
        model.Add(new Applicant{FirstName = "foo",LastName = "bar", Address = "Foo Bar"});
        model.Add(new Applicant { FirstName = "foo1", LastName = "bar1", Address = "Foo1 Bar1" });
        model.Add(new Applicant { FirstName = "foo2", LastName = "bar2", Address = "Foo2 Bar2" });

        return View(model);
    }
}

Application.cs(模型)

public class Applicant
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
}

Index.cshtml(查看)

@model IEnumerable<MvcApplication1.Models.Applicant>
@{
    Layout = null;
}
<html>
   <head>
     <title>this is a test</title>
   </head>
<body>
    <h1>This is a test</h1>
    @if (Model != null)
    {
        foreach (var item in Model)
        {
            @Html.DisplayFor(m => item)
            <br/>
        }
    }
</body>

结果输出

Result

答案 2 :(得分:0)

我发现如果我在模板中执行以下操作,我会按预期获得数据:

@model IEnumerable<Tens.Models.Applicant>

@{

foreach(var item in Model)
{
    @Html.DisplayFor(m=>item.Forenames)
    <br />
    @Html.DisplayFor(m=>item.Surname)
    <br />
    <text>----------------------------------</text>
<br />
}
}