请问如何将模型(接口(interface)类型)转换为其实际类型?
您在下面看到的显然是简化版本,专注于手头的问题。所以问题不是如何重新架构我的解决方案,而是具体如何将接口(interface)类型模型实例转换为 razor 中的实际类类型。
查看模型:
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
在 View 中我需要显示数据注释,但是MVC不会以面向对象的方式做到这一点。 如果我只是说
@model <path to>.IData
@Html.LabelFor(m => model.Data)
@Html.TextBoxFor(m => model.Data)
@Html.ValidationMessageFor(m => model.Data)
我得到的是接口(interface)上定义的内容,而不是实际类上定义的内容。 愚蠢的解决方案是进行巨大的转换并将 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();
}
etc 会发出可怕的警告,并且肯定不会在 Razor 中运行。
我确信可以通过模型的反射来获得,但无论我尝试什么都不起作用。 希望大家有一些新的想法。
小更新
我无法将 X 为数字的 Child 合并到一个模型中,因为事先不知道其中有多少个,在主视图中可以添加/删除它们。我画的图非常针对这个问题, View / Controller /模型比您在这里看到的要复杂得多。
提前致谢。
最佳答案
关于您的示例的简要说明:您显示了 IBase 接口(interface),但您的类正在实现 IData 接口(interface)。
您的模型不应成为接口(interface),而应该是您要使用的实际类型的对象(或者具有包含您要使用的类型的属性)。
例如,如果您想在 View 中显示有关两个子级的数据,请按如下方式设置模型:
public class ChildModel {
public Child1 { get; set; }
public Child2 { 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; }
}
将 ChildModel 返回到您的 View ,然后您不需要在 View 中进行任何转换(无论如何您都应该避免这样做)。
关于asp.net-mvc-3 - Razor 模型类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11809513/