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

Posted

技术标签:

【中文标题】用于接口或继承类的 ASP.NET MVC3 编辑器模板【英文标题】:ASP.NET MVC3 Editor Templates for interface or inherited classes 【发布时间】:2012-05-19 04:25:17 【问题描述】:

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

我有两个问题:

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

    我的界面使用泛型来定义属性的列表和返回类型。为此我不知道如何做模板。

我知道有两个查询但是做同样的问题。

档案:

理想的视图模型:

[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 FieldOneId = "1", Descripcion = "Description 1",
            new FieldOneId = "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 FieldTwoId = 1, Descripcion = "Descripcion 1",
            new FieldTwoId = 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 FieldTwoId = 1, Description = "Descripcion 1",
            new FieldTwoId = 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] 的模型项'。

谢谢

【问题讨论】:

对此有任何解决方案或变通方法吗? 【参考方案1】:

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

【讨论】:

好的,但这正是我想要避免做的事情,我正在寻求解决这个问题,因为它是“FF”并且我有很多 ViewModel。谢谢 问题是这行代码是无效的:ICanBeListed&lt;object, object&gt; example = new FieldTwo() - 例如,没有ICanBeListed&lt;in T, in U&gt;的组合使其有效。 +1,@Tejs 好的,我知道这是错误的,但我想知道是否有任何解决此问题的方法。

以上是关于用于接口或继承类的 ASP.NET MVC3 编辑器模板的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC3 - 将剃刀标记作为参数传递

使用防伪令牌将 JSON 模型发布到 ASP.Net MVC3

如何在 asp.net mvc3 中使用 Kendo UI Editor 和剃须刀?

在asp.net MVC3中怎么为一个实体类的ID属性设置为自动增长呢?此时ID不是主键,Code才是主键?如下

ASP.NET MVC3 - 带有@Html.EditorFor 的文本区域

ASP.Net MVC3 通过或不通过 Visual Studio 修改日期和小数的区域性?