【问题标题】:Find model type of a strongly-typed razor view (or any view)查找强类型剃刀视图(或任何视图)的模型类型
【发布时间】:2013-03-26 04:27:08
【问题描述】:

如何从控制器中找到(剃刀)视图的模型类型?我知道它们继承自 WebViewPage 和 WebViewPage,仅此而已。

(在 asp.net c# MVC 3 或 4 中)

提前致谢。

编辑-用例: 允许用户创建/上传/编辑视图和强类型视图,然后用户可以选择其中一个用户创建的视图来显示/编辑数据库中不同类型的数据。

因此,例如,应用程序检索对象 Foo,并且存在针对 Boo 和 Foo 的强类型视图。我不希望 Boo 的视图显示为 Foo 对象的可能选择。

【问题讨论】:

  • 如果您这样做,您需要了解允许用户在您的服务器上上传和运行任意代码的安全隐患。
  • 嗨,是的,我非常清楚。这不是“公开上传”,而是一个内部流程,利益相关者与内部开发人员合作,为内容管理者提供可供选择的视图。感谢您的关心。

标签: c# asp.net-mvc


【解决方案1】:

我不知道你为什么要这样做,但你可以这样做

@Model.GetType()

您应该尽量避免在视图中出现代码,并将逻辑推送到您的控制器或服务中。

【讨论】:

  • 更新问题。我想要做的是允许用户将不同的视图关联到一个对象。但是,我不希望他们将视图关联到没有正确模型类型的对象。
  • 你为什么要这么做?为什么你不能说...if(type)return View("typeView",obj);else return View(obj);也许你可以提供一个更好的例子?
【解决方案2】:

如果您有权访问IEnumerable<WebViewPage<T>>,则可以通过执行以下操作获取T 的类型:

// Assuming 'views' is a IEnumerable<WebViewPage<T>> here.
var validFooViews = views.Where(v =>
    v.GetType().GetGenericArguments()[0] == typeof(Foo));

【讨论】:

  • 在您的问题中,您提到用户可以从用户创建的视图列表中进行选择,因此我假设您可以访问这些数据。在我的示例中,我只是假设“views”是代码中其他地方定义的IEnumerable&lt;WebViewPage&lt;T&gt;&gt;
  • 遗憾的是,事实并非如此。视图由开发人员上传和部署为 cshtml。
猜你喜欢
  • 2015-02-17
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多