2012-02-02 24 views
0

我正在嘗試使用模板。我在使用使用Html.DisplayFor擴展mvc3 .net使用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

如果您想了解更多信息,請閱讀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

+0

有一個閱讀,但沒有真正回答我的問題如何做到這一點。將模板代碼移到視圖中,但這似乎不起作用。 – user1079925 2012-02-02 22:48:57

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 /> 
} 
} 
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)。