请问如何将模型(接口类型)转换为实际类型?
您在下面看到的显然是非常简化的版本,专注于手头的问题。所以问题不是如何重新构建我的解决方案,而是具体如何将接口类型模型实例转换为剃刀中的实际类类型。
查看型号:
public interface IData
{
string Data { get; set; }
}
public class Child1 : IData
{
[Display(Name = "Name1", Description = "Desc1", Prompt = "Prompt1")]
public string Data { get; set; }
}
public class Child2 : IData
{
[Display(Name = "Name2", Description = "Desc2", Prompt = "Prompt2")]
public string Data { get; set; }
}
// It gets to Child10 and there is dynamic number of each of them in the main ViewModel
在视图中我需要显示数据注释,但 MVC 不会以面向对象的方式进行。如果我只是说
@model <path to>.IData
@Html.LabelFor(m => model.Data)
@Html.TextBoxFor(m => model.Data)
@Html.ValidationMessageFor(m => model.Data)
我得到了接口上定义的内容,而不是实际类上定义的内容。愚蠢的解决方案是进行巨大的转换并将 Model 转换为它来自的实际类型:
@switch(Model.GetType().Name)
{
case "Child1":
var c1 = Model as Child1;
@Html.LabelFor(m => c1.Data)
@Html.TextBoxFor(m => c1.Data)
@Html.ValidationMessageFor(m => c1.Data)
break;
// etc
}
如果我有超过 3 个 IBase 的孩子(我确实有),Switch 就会变得难以管理,更不用说看起来很丑了。我如何使用反射来获取模型的类型,而不是进行切换?注意简单
@{
var c1 = Model as Model.GetType();
var c2 = (Model.GetType()) Model;
var c3 = (Type.GetType(Model.GetType())) Model;
var c4 = Model as Type.GetType(Model.GetType();
}
等给出可怕的警告,当然不会在剃刀中运行。
我确信可以通过模型的反射来获得,但无论我尝试过什么都行不通。希望大家有一些新鲜的想法。
小更新
我不能将 X 为数字的 Child 合并到一个模型中,因为它事先不知道其中有多少,在主视图中可以添加/删除这些。我画的图片非常针对这个问题,视图/控制器/模型比你在这里看到的要复杂得多。
提前致谢。