2011-11-21 134 views
4

說實話,我不知道該怎麼稱呼它或如何開始搜索它。ASP.NET MVC 3部分視圖模板

我有一個標準佈局的顯示頁面。

<div> 
    <label for="field">Field Name:</label> 
    @Model.Field 
</div> 

雖然試圖使這個更友好的更改,我想要一個模板,而不是用上面的代碼輸入每個字段。

我創建具有以下的部分視圖:

@model System.Object 
<div> 
    @Html.LabelFor(m => m) 
    @Html.DisplayFor(m => m) 
</div> 

在我的視圖,添加以下:

@Html.Partial("_BillField", Model.Field) 

然後,該模型具有與像的描述:

public ModelName { 
    [Display(Name="Field Description")] 
    public decimal Field { get; set; } 
} 

這適用於主視圖,但標籤在使用模板時缺失。我錯過了什麼?

更新: Per @ K。鮑勃我做出改變局部視圖:

<div> 
    @Html.LabelFor(m => m) 
    @Html.DisplayFor(m => m) 
</div> 

更新2:對於我想要的清晰度。

最後,我希望能夠做到:

@Html.Partial("_BillField", Model.Field1) 
@Html.Partial("_BillField", Model.Field2) 
@Html.Partial("_BillField", Model.Field3) 

而且具有相當於:

<div> 
    <label for="field1">Field 1 Name:</label> 
    @Model.Field1 
</div> 
<div> 
    <label for="field2">Field 2 Name:</label> 
    @Model.Field2 
</div> 
<div> 
    <label for="field3">Field 3 Name:</label> 
    @Model.Field3 
</div> 

對不起,不使該清晰。

+0

注意,參數'LabelFor'等人不是'Func',但一個'表達'。這是因爲它可以通過反射來訪問模型成員(也就是它的值,類型,名稱和屬性,例如'DisplayName')。當您將模型成員直接傳遞給partial時,您將更改該表達式,因此它不能再訪問成員,並且只能訪問成員的類型和值,因爲它缺少模型的上下文。 – jpaugh

+0

您可能想要的是一個自定義模型聯編程序或模型聯編程序模板,儘管我沒有這些經驗。 – jpaugh

回答

1

我覺得可能你應該使用顯示/編輯模板類型,你的模型包括該類型的3場。

@Html.Partial("_BillField", Model.Field1) 
@Html.Partial("_BillField", Model.Field2) 
@Html.Partial("_BillField", Model.Field3) 

爲類型而不是部分視圖定義模板可能更有效。有關詳細比較,請參見ASP.NET MVC 3 - Partial vs Display Template vs Editor Template

在這種情況下,您的瀏覽看起來更像:

@Html.DisplayFor(model => model.Field1) 
@Html.DisplayFor(model => model.Field2) 
@Html.DisplayFor(model => model.Field3) 

你的模型應該是:

public class model 
{ 
    [DisplayName("Field1")] 
    public ComplexType Field1 {get;set;} 
    [DisplayName("Field2")] 
    public ComplexType Field2 {get;set;} 
    [DisplayName("Field3")] 
    public ComplexType Field3 {get;set;} 
} 

或任何數據註解是顯示名稱。

+1

我決定不再做我以前想的事,但這可能是最好的解決方案。 –

1

你不需要ToString()你的財產。

@Html.LabelFor(m => m) 

修訂

根據你想要做的,重用的意見,看看這比正常的一篇關於驗證和局部視圖的重用不再是我寫的最多的答案ASP.NET MVC 3 - Model Validation。它非常詳細。

+0

糟糕。錯誤的複製粘貼。 'ToString()'吹掉了頁面,我忘了在發佈之前刪除它。這是固定在原來的職位。 –

2

該部分不需要告知@model是什麼,如果您在部分幫助中取出@model,它將使用父級@model?

如果我有這樣的觀點....

@model MyApp.Models.ModelName 
@{ 
    ViewBag.Title = "Test"; 
} 

<h2>Test</h2> 
<div> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.Field) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.Field) 
       @Html.ValidationMessageFor(m => m.Field) 
      </div> 
</div> 
@Html.Partial("_partial", Model) @*note I pass the whole model*@ 

並將此作爲局部....

@model MyApp.Models.ModelName 
<div> 
       <div class="editor-label"> 
       @Html.LabelFor(m => m.Field) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.Field) 
       @Html.ValidationMessageFor(m => m.Field) 
      </div> 
</div> 

然後它做什麼,我想你想要做的(OBV它做了兩次,但你可以從主視圖中刪除代碼)。 雖然我不確定它會給你帶來巨大的好處。也許我誤解了一些東西。

+0

不,它沒有。修復問題以反映更改 –

+0

@Mike - 當您調用此@@ Html.Partial(「_ BillField」,Model.Field)時,它只傳遞Field屬性的值,而不是整個字段屬性作爲具有數據註釋的屬性附加到它(如果你明白我的意思) –

+0

@MikeWills - 我已經用一個工作示例更新了我的答案,所以忽略關於沒有爲此示例聲明的模型的一點。如果您傳遞一個值(如Model.Field),則不需要該模型。 –

0

增加了一個新的答案,另一個沒有回答一次澄清這個問題。 這篇文章LabelFor extension應該能夠根據你的需求進行調整,但我認爲這並不是爲了創建你自己的擴展而重寫更好。

,因爲你需要使用m=>m.Field語法你需要稍微不同於你打算如何調用它。但我相信這應該做你所需要的,而不必使用局部視圖。

如果您使用Model.Field語法,您將只發送字段屬性的實際值,例如1.23作爲小數,您需要使用m=>m.Field以獲取更多的屬性評估,以便您可以更改標籤中的文字。