2012-05-10 38 views
4

需要使用「EditorTemplate」採用的接口,在將使用一個類的方式相同。ASP.NET MVC3編輯模板用於接口或繼承類

我有兩個問題:

  1. 我只承認「EditorTemplate」如果我包括「DataAnnotation」,「數據類型」與名「EditorTemplate」。這並沒有打擾我很多,但能夠通過類型識別它會很好,就像它具有帶我的類型(類)名稱的「EditorTemplate」一樣。 [DataType ("ICanBeListed")]

  2. 我的接口使用泛型來定義列表,並返回的屬性類型。出於這個原因,我不知道如何做模板。

我知道有兩個查詢,但也有同樣的問題。

歸檔:

較佳視圖模型:

[DisplayName("Field one")] 
public FieldOne MyFieldOne { get; set; } 

[DisplayName("Field two")] 
public FieldTwo MyFieldTwo { get; set; } 

解點1:

[DisplayName("Field one")] 
[DataType("ICanBeListed")] 
public FieldOne MyFieldOne { get; set; } 

[DisplayName("Field two")] 
[DataType("ICanBeListed")] 
public FieldTwo MyFieldTwo { get; set; } 

接口:

public interface ICanBeListed<T, U> 
{ 
    U Id { get; set; } 

    string Description { get; set; } 

    IList<T> ToList(); 
} 

類:

public class FieldOne : ICanBeListed<FieldOne, string> 
{ 
    public string Id { get; set; } 

    public string Descripcion { get; set; } 

    public IList<FieldOne> List() 
    { 
     return new List<FieldOne> 
     { 
      new FieldOne{Id = "1", Descripcion = "Description 1"}, 
      new FieldOne{Id = "2", Descripcion = "Description 2"} 
     }; 
    } 
} 


public class FieldTwo : ICanBeListed<FieldTwo, int> 
{ 
    public int Id { get; set; } 

    public string Descripcion { get; set; } 

    public IList<FieldTwo> List() 
    { 
     return new List<FieldTwo> 
     { 
      new FieldTwo{Id = 1, Descripcion = "Descripcion 1"}, 
      new FieldTwo{Id = 2, Descripcion = "Descripcion 2"} 
     }; 
    } 
} 

模板編輯器:

@model Mvc3ConditionalValidation.Models.ICanBeListed<object, object> 
@Html.DropDownListFor(model => model.Id, new SelectList(Model.ToList(), "Id", "Description")) 

查看:

<div class="editor-field"> 
    @Html.EditorFor(model => model.MyFieldOne) 
    @Html.ValidationMessageFor(model => model.MyFieldOne) 
</div> 

<div class="editor-label"> 
    @Html.LabelFor(model => model.MyFieldTwo) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.MyFieldTwo) 
    @Html.ValidationMessageFor(model => model.MyFieldTwo) 
</div> 

我試圖改變接口的類:

視圖模型:

public class FieldTwo : CanBeListed<FieldTwo, int> 
{ 
    public override int Id { get; set; } 

    public override string Description { get; set; } 

    public override IList<FieldTwo> ForList() 
    { 
     return new List<FieldTwo> 
     { 
      new FieldTwo{Id = 1, Description = "Descripcion 1"}, 
      new FieldTwo{Id = 2, Description = "Descripcion 2"} 
     }; 
    } 
} 

類(前接口):

public abstract class CanBeListed<T, U> 
{ 
    public virtual U Id { get; set; } 

    public virtual string Description { get; set; } 

    public abstract IList<T> ForList(); 
} 

但問題是相同的:

傳遞到詞典中的模型產品類型「Mvc3ConditionalValidation.Models.FieldOne」的,但本詞典需要一個模型類型'Mvc3ConditionalValidation.Models.CanBeListed`2 [System.Object,System.Object]'的項目。

感謝

+0

任何解決方案或解決方法呢? – Odys

+0

@odyodyodys尚未 –

回答

0

你宣佈該EditorTemplate只能採取ICanBeListed<object, object>。基本上,你宣佈要使用相同的ICanBeListed<,>模板兩種不同類型的,這不是在做你想要什麼。您需要創建一個EditorTemplate爲FieldOneFieldTwo這是不同的,這樣就可以正確地使模型類型匹配。

+1

好吧,但這正是我想要避免做的,我正在尋求解決這個問題,因爲它是「FF」,我有很多ViewModel。謝謝 –

+1

問題是這行代碼是無效的:'ICanBeListed example = new FieldTwo()' - 例如,沒有組合ICanBeListed '。 – Tejs

+0

+1,@Tejs好,我知道這是錯誤的,但我想知道是否有任何解決方案此探針。 –