asp.net MVC3剃刀语法反射投模型来它的子类(asp.net mvc3 razor synt

2019-09-20 21:48发布

我有很简单的问题,我无法找到答案。 在Razor视图有接口类型的模型。 该接口有多个子类实现它。 现在的问题是: 我怎么能投的模式,它的实际类型 ? 我必须有实际类型的变量,但不知道如何从反射IE得到它

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

你可以想像我不感兴趣, Model as ActualType(ActualType) Model ,因为我不知道什么实际类型是提前到来做。 其对技术,而不是架构的问题。

提前致谢!

Answer 1:

你真是在错误的道路上这里。 你真的不能做你希望做在这里,因为你并没有真正通过思前想什么。 像这样的语句:

var actualType1 = Model as Model.GetType(); 

不会起作用,因为变种是不是动态类型,它是在编译时输入的,而不是在运行时静态类型。 所以,即使你能够以某种方式设法得到它的工作,那就只有一种类型,以往的工作(直到它再次被重新编译)。

除此之外,接口是这个糟糕的选择,因为接口的属性是从实现属性独立。 所以不管什么属性,你有你的课,你会不会通过这个类的一个接口得到它们。



Answer 2:

听起来像是你有,根据你的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 { }

在你看来,你通过其中AnonymousViewModelUserViewModel ,那么在视图中没有逻辑:

@model SomeViewModel

@Html.EditorFor(m => m.FormField)

@Html.EditorFor(m => m.FormField2)


文章来源: asp.net mvc3 razor syntax to cast a model to its subclass by reflection