代码之家  ›  专栏  ›  技术社区  ›  Display Name

asp.net mvc3剃刀语法,通过反射将模型转换为其子类

  •  2
  • Display Name  · 技术社区  · 12 年前

    我有一个很简单的问题,我找不到答案。 在剃刀视图中有一个接口类型的模型。该接口有多个子类来实现它。 问题是: 如何将模型转换为实际类型 ? 我 必须 有实际类型的变量,但不知道如何从反射中获取 即。

    @model IInterface
    @{
       var actualType1 = Model as Model.GetType(); // doesn't work :(
       var actualType2 = (Model.GetType()) Model; // doesn't work :(
    }
    

    你可以想象,我对 Model as ActualType (ActualType) Model 因为我不知道实际类型是什么。这是一个技术问题,而不是架构问题。

    提前感谢!

    2 回复  |  直到 12 年前
        1
  •  2
  •   Erik Funkenbusch    12 年前

    你真的走错了路。你不能真的在这里做你想做的事情,因为你没有真正想清楚。这样的声明:

    var actualType1 = Model as Model.GetType(); 
    

    不能工作,因为var不是动态类型,它是在编译时而不是运行时键入的静态类型。因此,即使您能够以某种方式使它工作,它也只能用于一种类型(直到它再次重新编译)。

    除此之外,接口是一个糟糕的选择,因为接口属性与实现属性是分开的。因此,无论类上有什么属性,都不会通过该类的接口获得它们。

        2
  •  0
  •   Erik Philips    12 年前

    根据你的OP评论,听起来你有一些数据注释问题。我强烈建议完全重新创建一些使用 MetadataType

    public SomeViewModel
    {
      public string FormField { get; set; }
      public string FormField2 { get; set; }
    }
    
    public interface IAnonymousSomeViewModel
    {
      [Required]
      public string FormField { get; set; }
      [Scaffold(false)]
      public string FormField2 { get; set; }
    }
    
    
    public interface IUserSomeViewModel
    {
      [Scaffold(false)]
      public string FormField { get; set; }
      [Required]
      public string FormField2 { get; set; }
    }
    
    [MetadataType(typeof(IAnonymousSomeVieModel)]
    public AnonymousViewModel : SomeViewModel { }
    
    
    [MetadataType(typeof(IUserSomeVieModel)]
    public UserViewModel : SomeViewModel { }
    

    在你看来,你要么通过 AnonymousViewModel UserViewModel ,则视图中没有逻辑:

    @model SomeViewModel
    
    @Html.EditorFor(m => m.FormField)
    
    @Html.EditorFor(m => m.FormField2)