需要以与使用类相同的方式使用带有接口的“ EditorTemplate”。
我有两个问题:
如果我包含名称为“ EditorTemplate”的“ DataAnnotation”“ DataType”,则只能识别“ EditorTemplate”。这不会打扰我,但是能够按类型识别它会很不错,就像它具有一个带有我的类型(类)名称的“ EditorTemplate”一样。 [DataType ("ICanBeListed")]
我的界面使用泛型来定义属性的列表和返回类型。因此,我不知道如何做模板。
我知道有两个查询,但执行相同的问题。
档案:
理想的视图模型:
[DisplayName("Field one")]
public FieldOne MyFieldOne { get; set; }
[DisplayName("Field two")]
public FieldTwo MyFieldTwo { get; set; }
第一点的解决方案:
[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]”。
谢谢
最佳答案
您在声明EditorTemplate只能使用ICanBeListed<object, object>
。基本上,您是在声明要对两种不同的类型使用相同的ICanBeListed<,>
模板,这不是您要执行的操作。您需要为FieldOne
和FieldTwo
创建不同的EditorTemplate,以便可以正确地使模型类型匹配。