用于接口或继承类的ASP.NET MVC3编辑器模板

时间:2012-05-10 14:54:34

标签: c# asp.net-mvc asp.net-mvc-3 razor mvc-editor-templates

需要使用" EditorTemplate"使用接口,与使用类的方式相同。

我有两个问题:

  1. 我只识别" EditorTemplate"如果我包含" DataAnnotation" "数据类型"名为" EditorTemplate"。这并没有太多困扰我,但能够按类型识别它会很好,就像它有一个" EditorTemplate"我的类型(类)的名称。 [DataType ("ICanBeListed")]

  2. 我的界面使用泛型来定义列表并返回属性类型。出于这个原因,我不知道如何做模板。

  3. 我知道有两个查询,但也会遇到同样的问题。

    档案:

    理想的视图模型:

    [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"}
            };
        }
    }
    

    Class(接口之前):

    public abstract class CanBeListed<T, U>
    {
        public virtual U Id { get; set; }
    
        public virtual string Description { get; set; }
    
        public abstract IList<T> ForList();
    }
    

    但问题是一样的:

    传入字典的模型项的类型为&#39; Mvc3ConditionalValidation.Models.FieldOne&#39;,但此字典需要类型为&#39; Mvc3ConditionalValidation.Models.CanBeListed`2的模型项[ System.Object,System.Object]&#39;。

    由于

1 个答案:

答案 0 :(得分:0)

您声明EditorTemplate只能使用ICanBeListed<object, object>。基本上,您声明要为两种不同的类型使用相同的ICanBeListed<,>模板,这不是您想要做的。您需要为FieldOneFieldTwo创建一个不同的EditorTemplate,以便您可以正确地使模型类型匹配。