2012-05-10 10 views
4

クラスを使用するのと同じ方法で、インターフェイスを使用する「EditorTemplate」を使用する必要があります。ASP.NET MVC3 Editorインターフェイスまたは継承クラスのテンプレート

は、私は2つの問題を抱えている:

  1. 私はEditorTemplate「「の名を持つ」「DataAnnotation」」データ型が含まれている場合、私は唯一の「EditorTemplate」を認識しています。これは私にはあまり気にしませんが、タイプ(クラス)の名前を持つ "EditorTemplate"を持っていた場合と同じように、タイプでそれを認識できるのは良いことです。 [DataType ("ICanBeListed")]

  2. 私のインターフェイスは、ジェネリックを使用してリストを定義し、プロパティの型を返します。このため、私はテンプレートをどのように行うのか分かりません。

私は2つのクエリがありますが、同じ問題があることを知っています。

アーカイブ:

望ましいビューモデル:

[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(); 
} 

クラス:ポイント1

[DisplayName("Field one")] 
public FieldOne MyFieldOne { get; set; } 

[DisplayName("Field two")] 
public FieldTwo MyFieldTwo { get; set; } 

ソリューション

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 not yet –

答えて

0

あなたはEditorTemplateのみICanBeListed<object, object>を取ることができることを宣言しています。基本的には、同じICanBeListed<,>テンプレートを2種類の異なるタイプに使いたいと宣言しています。これは実行したくないものです。別のモデルのFieldOneFieldTwoのEditorTemplateを作成して、モデルタイプを正しく一致させる必要があります。

+1

これはまさに私がやりたくないことです。私はこれを "FF"に解決するために探しています。私は多くのViewModelを持っています。ありがとう –

+1

問題はこのコード行が無効であることです: 'ICanBeListed example = new FieldTwo()' - 例えば 'ICanBeListed 'の組み合わせはそれを有効にしません。 – Tejs

+0

+1、@Tejs ok、私は間違っていることを知っていますが、私はこのprobemaに解決策があるかどうかを知りたいと思っていました。 –

関連する問題