表示テンプレートと、インターフェイスおよびインターフェイスを実装するオブジェクトの処理に問題があります。この例では、固定された方法でレンダリングしたい多くのオブジェクトがあり、インターフェイスを作成し、共有表示テンプレート フォルダーに配置することにしたビューでこれを参照することにしました。 DisplayFor
ビューにインターフェイスを実装する渡されたオブジェクトに対して機能するように縫い目がありません。これに対する解決策を知っている人はいますか。
おそらくコードで説明する方が簡単なので、簡単な例を書きました。基本インターフェースとそれを継承する 2 つのクラス:
public interface IPet
{
String Name { get; }
}
public class Dog : IPet
{
public String Name { get; set; }
}
public class Cat : IPet
{
public String Name { get; set; }
}
共有表示テンプレートの表示テンプレートの例
@model IPet
<div>@Model.Name</div>
ビューに渡されるビューモデルの例
public class VM
{
public IPet Master { get; set; }
public IEnumerable<IPet> Minions { get; set; }
}
コントローラー (この場合はモック情報を作成するため)
public ActionResult Index()
{
var viewModel = new VM();
viewModel.Master = new Cat(){Name = "Fluffy"};
var minions = new List<IPet>();
minions.Add(new Dog(){Name = "Dave"});
minions.Add(new Dog(){Name = "Pete"});
minions.Add(new Cat(){Name = "Alice"});
viewModel.Minions = minions;
return View(viewModel);
}
そして最後に、私が期待するDisplayFor
ビュー
@model ViewInheritance.Models.VM
<h2>Master</h2>
@Html.DisplayFor(x => x.Master)
<h2>Minions</h2>
@Html.DisplayFor(x => x.Minions)
すべてのオブジェクトがビュー モデルでインターフェイスとして定義されている場合、表示テンプレートを使用できないのはなぜですか?
私が見つけた1つの解決策は、単にコードを使用することです
@Html.DisplayFor(x => x.Master, "IPet")
要約すると、質問は次のとおりです。
なぜこれが起こるのですか?どのタイプの実装が実際に共通の共有ビューを見ているべきかをDisplayFor
正しく理解する方法はありますか?Cat
IPet
IPet.cshtml
ありがとう