我正在尝试使用模板。
我在使用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以只读方式显示这些数据,但我尝试了许多不同的方法,但无法使其工作。 任何帮助表示赞赏。
答案 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>
结果输出
答案 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 />
}
}