asp.net-mvc-3 - Razor 模型类型转换

标签 asp.net-mvc-3 razor casting data-annotations system.reflection

请问如何将模型(接口(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/

相关文章:

javascript - 如何从 javascript 打开操作调用的 View 结果

razor - 为什么我不能在 App_Code 文件夹中的 Razor 助手 View 文件中使用 Html.RenderPartial?

c# - 为什么在检查变量是否为枚举值时不能使用 'as'?

node.js - Mongoose:为值 "[ 5ac5cfb41fca8a22f519cb22 ]"转换为数组失败

c# - 如何在 MVC 3 中使用 LabelFor

asp.net-mvc-3 - MVC3/Razor : cshtml. Execute()':找不到合适的方法来覆盖

asp.net-mvc - Html.Textbox VS Html.TextboxFor

c# - 如何使用 TimePicker 到 DatePicker MVC3 C#

C++ 将指针从一种类型转换为另一种类型

asp.net - Web 部署任务失败