2012-05-10 41 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好,我知道这是错误的,但我想知道是否有任何解决方案此探针。 –