3

mvcテンプレートとジェネリックに関していくつか質問がありましたが、私が探しているものとは関係がないようです。次のモデルを検討してください。

namespace MyNamespace
{
    public class ModelBase { /* Not important for example */ }

    public class MyModel : ModelBase
    {
        public string Name { get; set; }
    }

    public class MyViewModel
    {
        public IEnumerable<ModelBase> Data { get; set; }
    }
}

そしてコントローラー:

public class HomeController : Controller
{
    public ActionResult Index 
    {
        return View(new MyViewModel { Data = new List<MyModel>() })
    }
}

RazorビューViews/Home/Index.cshtmlは次のようになります。

@model MyNamespace.MyViewModel
@Html.EditorFor(m => m.Data)

特別なことは何もありません。そのためのディスプレイまたはエディターテンプレートが必要な場合は、Views / Shared/EditorTemplateまたはViews/Home / EditorTemplatesの下にMyModel.cshtmlというファイルを作成すると、正しく検出されます。

リストを表示するときにModelBaseの実装ごとに異なることをしたい場合はどうすればよいですか?Mvcビューファインダーは、上記のパスのいずれかでList'1.cshtmlテンプレートを正しく検出します。しかし、私がする必要があるのは、List`1[MyModel].cshtmlのテンプレートを作成することです。

正しいファイル名を取得できないようです。私がこれまでに試したこと(この例の命名と比較して):

  • List`1 [MyModel] .cshtml
  • List`1[[MyModel]]。cshtml
  • List`1 [MyNamespace.MyModel] .cshtml
  • List`1[[MyNamespace.MyModel]]。cshtml

可能であれば、カスタムビューファインダーを作成することは避けたいと思います。上記のものを機能させることができない場合に私が今考えることができる唯一の選択肢は、List`1.cshtmlにListから推測された名前でパーシャルを呼び出させることです。

4

3 に答える 3

7

非常に遅い応答。他の誰かがこの同じ質問にぶつかった場合に役立ちます(これを行う方法を覚えようとして少し前に行ったように)

UIHintAttributeを使用して、エディターの名前を定義できます

public class MyViewModel
{
    [UIHint("MyModel")]
    public IEnumerable<ModelBase> Data { get; set; }
}
于 2012-11-08T15:07:20.320 に答える
1

このコードはチェックしていませんが、サブタイプごとに異なるビューを作成し、次のような馬鹿げたことをします。

return View(MyModel.GetType().Name, new MyViewModel { Data = new List<MyModel>() })

ビューがタイプの名前と一致するようにします。

于 2012-05-16T11:11:40.867 に答える
0

メインビューでこれを行うことができます:

@model MyViewModel
@Html.EditorFor(x => x.Data)

そして持っている:

  • ~/Views/Shared/EditorTemplates/MyModel.cshtml

    @model MyModel
    ...
    
  • ~/Views/Shared/EditorTemplates/MyOtherModel.cshtml(明らかにMyOtherModelから派生しますModelBase):

    @model MyOtherModel
    ...
    

など...ASP.NETMVCは、Dataプロパティのループを処理し、このコレクションの各要素の実行時の種類に基づいて正しいテンプレートを選択します。

于 2012-05-16T12:16:33.270 に答える