【问题标题】:How to create a strongly typed view during runtime in ASP.NET MVC?如何在 ASP.NET MVC 运行时创建强类型视图?
【发布时间】:2015-08-18 06:04:22
【问题描述】:

我正在使用 ASP.NET MVC,并且需要在运行时根据用户选择创建新视图。这些视图一旦创建,就需要保存在存储中,以便可以重复使用。我更喜欢这些视图是强类型的。每个新视图的模型类自然不存在,这些类将根据用户创建的内容具有新属性。

例如,如果用户选择一个文本框并希望将其用作名字,最终我希望使用名为 FirstName 的公共属性动态创建一个类...等等。一切都是即时创建的。

我想了解如何解决这个问题。 Dynamic Source Code Generation and Compilation 是否适用于这个工作流程,或者这是否比它应该的更复杂?

更新:
一个用例是如果需要根据用户对数据库表的选择来创建表单。如果有数百个表,我不会创建数百个视图。我知道我可以在这个例子中使用网格视图,但对于所有情况,动态视图更合适。

【问题讨论】:

  • 为什么不使用通用视图和模型?
  • 我将有绑定到模型类的表单元素
  • 你问错问题了。您已经决定要遵循特定的方法,但您不知道如何使该方法起作用,因此您在询问如何使该方法起作用……但实际上您需要询问如何解决您的实际问题(不一定是动态代码生成)。您应该做的是询问您实际想要开发的功能......而不是您想要实现的技术。你能准确解释一下你想做什么,它的目的是什么?
  • @Erik 我想动态创建视图。我已经解释了为什么需要这样做。用户可以根据他们想要看到的内容实时创建表单。然后我说我希望将元素绑定到模型类,以便它们可以轻松保存和重用。这些是特征。然后我问代码生成是否是一个好方法。我想我说清楚了。如果你不明白我想说什么,也许你需要问一些具体的问题。
  • “根据他们想要看到的内容实时创建表单”并不意味着您需要任何类型的任何代码生成。我问的是细节,因为那太模糊了。例如,您可以在模型中简单地拥有“CustomForm”对象的集合,这些对象可以是派生类型的层次结构,所有这些都在基本集合中。然后,您可以使用编辑器和显示模板来呈现这些类型,无需生成代码,并且您仍然可以获得强类型。这是我的观点,因为您会立即跳到一个不需要且复杂的实现。

标签: c# .net asp.net-mvc dynamic


【解决方案1】:

您的用户选择是数据,而不是代码:

  • 根据用户选择创建数据结构。
  • 将它们保存在数据库中以备后用。
  • 编写一个视图来获取这些数据结构(作为模型)并显示它们。
  • EditorTemplates 可用于显示每个单独的控件,使用强类型视图。

数据

 public class Page
 {
     public List<Control> Controls { get; set; }
 }

 public class Textbox : Control
 {
     public string Label { get; set; }
     public string Value { get; set; }
 }

Page.cshtml

@model Page

@for (int i 0; i < Model.Controls.Count; i++)
{
     // Render using the EditorTemplate view for the control's type
     @Html.EditorFor(m => m.Controls[i])
}

EditorTemplates/Textbox.cshtml

@model Textbox

@Html.HiddenFor(m => m.ControlId)

@Html.LabelFor(m => m.Value, Model.Label)
@Html.TextBoxFor(m => m.Value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多