4

需要以与使用类相同的方式使用采用接口的“EditorTemplate”。

我有两个问题:

  1. 如果我包含名称为“EditorTemplate”的“DataAnnotation”“DataType”,我只会识别“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]”的模型项。

谢谢

4

1 回答 1

0

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

于 2012-05-10T15:01:43.197 回答