2

请问如何将模型(接口类型)转换为实际类型?

您在下面看到的显然是非常简化的版本,专注于手头的问题。所以问题不是如何重新构建我的解决方案,而是具体如何将接口类型模型实例转换为剃刀中的实际类类型。

查看型号:

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 合并到一个模型中,因为它事先不知道其中有多少,在主视图中可以添加/删除这些。我画的图片非常针对这个问题,视图/控制器/模型比你在这里看到的要复杂得多。

提前致谢。

4

1 回答 1

2

关于您的示例的快速说明:您显示了 IBase 的接口,但您的类正在实现接口 IData。

您的模型不应成为接口,而应是您将要使用的实际类型的对象(或具有包含您要使用的类型的属性)。

例如,如果您想在视图中显示有关两个孩子的数据,请像这样设置您的模型:

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 返回到您的视图的位置,然后您不需要在您的视图中进行任何转换(无论如何您都应该避免)。

于 2012-08-04T15:04:42.770 回答