2011-11-19 53 views
0

我有類如下的類。這是許多類以相同的一些屬性,如CreatedBy和ModifiedBy:如何在視圖之間共享包含Html.TextVoxFor的樣板代碼?

public class Test1 { 
    [DisplayName("Created By")] 
    public string CreatedBy { get; set; } 
    [DisplayName("Modified By")] 
    public string ModifiedBy { get; set; } 
} 
public class Test2 { 
    [DisplayName("Created By")] 
    public string CreatedBy { get; set; } 
    [DisplayName("Modified By")] 
    public string ModifiedBy { get; set; } 
} 

我想有一個代碼塊,我在這些類不同的看法重用。代碼塊應該已經格式化的數據,如:

 <div class="a"> 
      @Html.LabelFor(model => model.Note.CreatedBy) 
      @Html.TextBoxFor(model => model.Note.CreatedBy) 
     </div> 
     <div class="b"> 
      @Html.LabelFor(model => model.Note.ModifiedBy) 
      @Html.TextBoxFor(model => model.Note.ModifiedBy) 
     </div> 

我看着這樣做的,最初的幾個不同的方法是使用一個類來保存所有修改和創建的數據。我的解決方案是基於這樣的:

Another solution

不過現在我已經被告知我不能使用一個類,在這個解決方案,其中數據在一個類中RowInfo持有使用。我必須直接使用上面顯示的類Test1和Test2中的字段。

任何人都可以建議我如何安排HTML代碼被多個類重用。我知道我可以使用幾種不同的方法,但我所知道的所有方面似乎都不允許我在共享相同字段的多個類之間共享代碼。

我希望這是有道理的。如果不告訴我,我會解釋更多。

回答

1

你可以定義一個基本視圖模式:

public abstract class BaseViewModel 
{ 
    [DisplayName("Created By")] 
    public virtual string CreatedBy { get; set; } 
    [DisplayName("Modified By")] 
    public virtual string ModifiedBy { get; set; } 
} 

,然後有兩個類似的視圖模型從這個基本視圖模型推導出(因爲它們共享常見功能):

public class Test1 : BaseViewModel 
{ 
} 

public class Test2 : BaseViewModel 
{ 
} 

下一頁您可以爲基本視圖模型定義自定義編輯器模板(~/Views/Shared/EditorTemplates/BaseViewModel.cshtml):

@model BaseViewModel 
<div class="a"> 
    @Html.LabelFor(model => model.CreatedBy) 
    @Html.TextBoxFor(model => model.CreatedBy) 
</div> 
<div class="b"> 
    @Html.LabelFor(model => model.ModifiedBy) 
    @Html.TextBoxFor(model => model.ModifiedBy) 
</div> 

作爲一個側面說明,你也可以使用一個接口,而不是一個抽象類的基本模型:

public interface IBaseViewModel 
{ 
    [DisplayName("Created By")] 
    string CreatedBy { get; set; } 
    [DisplayName("Modified By")] 
    string ModifiedBy { get; set; } 
} 

,並有編輯模板類型的輸入到該接口。

然後你的主視圖模型:

public class MyViewModel 
{ 
    public Test1 Test1 { get; set; } 
    public Test2 Test2 { get; set; } 
} 

,你可以調用使用EditorFor幫手自定義編輯器模板:

@model MyViewModel 
@Html.EditorFor(x => x.Test1) 
@Html.EditorFor(x => x.Test2) 
+0

我有點困惑。我的類Test1和Test2是數據類,並繼承如下:「公共類Test1:TableServiceEntity」你的意思是稱它爲「BaseViewModel」?他們也可以來自不止一個班級嗎? –

+0

@SamanthaJ,ASP.NET MVC中的規則1(以及對我來說最重要的規則):你從不**將數據/域類傳遞給你的視圖。你總是定義和使用視圖模型。視圖模型是專門爲視圖的需求定義的類。所以如果你說Test1和Test2是從某個TableServiceEntity派生出來的,那麼這些類永遠不會到達你的視圖。他們可以被你的控制器操作操縱,但是這個動作應該將它們映射到你定義的相應的視圖模型。然後將這個視圖模型傳遞給視圖。 –

+0

是的,我正在使用viewModels。類Test1和Test2都有自己的viewModels,然後有很多字段的視圖。就在每個視圖的底部,我想把這個共享塊。如果我使用編輯器模板,那麼我可以使用這個特定的字段塊嗎?希望它是有道理的。 –

0

你有沒有嘗試把代碼放入局部視圖中,然後可以在任何頁面/視圖中使用?

+1

這將是罰款。但是,如果我理解正確,我的部分視圖需要指定一個模型,這些類的視圖使用不同的模型。所以我不能分享一個局部視圖。如果我錯了,請糾正我。謝謝 –