2013-10-02 56 views
1

我有一個模型:爲什麼我的自定義DisplayFor模板實際上不在這裏呈現?

public class PostModel 
{ 
    public int PostId { get; set; } 

    [Required] 
    [Display(Name = "Title")] 
    public string Title { get; set; } 

    [Required] 
    [Display(Name = "Idea")] 
    [DataType(DataType.MultilineText)] 
    public string Body { get; set; } 

    [Required] 
    public int UserId { get; set; } 

    public string UserName { get; set; } 
} 

,我已經創建了一個自定義顯示在/Shared/DisplayTemplates/PostModel.ascx。然後我就Home/Index視圖中顯示完整的列表:

@foreach (var p in Model.Popular) 
{ 
    Html.DisplayFor(m => p); 
} 

當通過視圖步進,如果我步入Html.DisplayFor,我進入/Shared/DisplayTemplates/PostModel.ascx連帶如預期進行處理。然而,它從來沒有真正得到渲染。

我錯過了什麼?

這裏是模板:

<%@ Control Language="C#" 
    AutoEventWireup="true" 
    CodeBehind="PostModel.ascx.cs" 
    Inherits="System.Web.Mvc.ViewUserControl<TPB.Models.PostModel>" %> 

<div class="rounded-border"> 
    <h2><%= Html.DisplayTextFor(m => m.Title) %></h2> 
    <p><%= Html.DisplayTextFor(m => m.Body) %></p> 
</div> 
+0

從我的理解中,您不能將Razor與經典引擎混合使用。 – Aron

+0

@Aron,這實際上是'DisplayFor'和'EditorFor'方法的工作方式。他們尋找'ascx'文件。我只是想念'@'。 –

+0

您正在混合Classic ViewEngine和Razor View Engine。你確定'HtmlHelper.DisplayFor'和'HtmlHelper.EditorFor'應該解析正確的模板,它會在'Views/Shared/DisplayTemplates/{classname}。{extension}'中查找模板。它不應該在視圖引擎之間移動。 http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx – Aron

回答

3

@Dai接近。 Response.Write應該不能用於此。你需要在前面的@符號告訴Razor返回的值應該被渲染到頁面中。

這應該工作:

@foreach (var p in Model.Popular) { 
    @Html.DisplayFor(m => p); 
} 

在我的測試在其他項目中,你應該甚至不應該真正需要的循環,如果你正在做的是顯示IEnumerable的所有成員(名單,陣列等)。

@Html.DisplayFor(m => m.Popular); 

已經爲我工作。

+0

這正是我所需要的。是的,後者在整個系列上都能很好地工作! –

0

DisplayFor返回MvcHtmlString一個實例,它實際上並沒有寫入任何響應流。

你會想這樣的:

@foreach (var p in Model.Popular) { 
    Response.Write(Html.DisplayFor(m => p)); 
} 
+0

雖然這確實會導致它被渲染,但它實際上被渲染在屏幕的頂部。可能是因爲'Response.Write'實際上並沒有注意到DOM。 –

+0

DOM與它無關。你是否在另一段寫入MvcHtmlString而不是響應流的代碼中調用'DisplayFor'? – Dai

+0

我在一個視圖裏面。 '/ Home/Index'視圖。我試圖呈現這些模型的集合。 –

相關問題