【问题标题】:How to create dynamic forms on the fly based on models in mvc? [closed]如何基于 mvc 中的模型动态创建动态表单? [关闭]
【发布时间】:2017-05-09 09:03:57
【问题描述】:

我们有一些客户希望以不同的方式使用网页。如果我应该更清楚一点,假设我们有一个 Person 模型,并且这个模型显然具有一些属性,例如 Name、Number、Address 等。

客户 X 希望属性 Name必需NumberinvisibleAddress 作为只读

客户 Y 希望属性 Name 作为必需Number 作为必需Address 作为不可见

其他客户对这些页面的需求不同。

我不想为每个客户创建一个页面。如我所见,我可能需要动态网页构建器之类的东西,它可以让我们的客户根据模型构建自定义页面。

你认为我可以如何处理这个问题? MVC 或 jQuery 中是否有开源解决方案?还有其他推荐吗?

【问题讨论】:

  • 这个用例可能有点类似于表单生成器或问卷生成器软件,其中网上有很多示例,有些是商业的,有些没有。我不会为你做所有的研究,但你可能能够找到与 MVC 兼容的东西,或者内置了自己的模型和验证结构(这意味着你不需要 MVC 的模型部分所以很多)。
  • @ADyson 在问这里之前我已经快速浏览了一下,但是我发现的任何解决方案都不是基于 mvc 模型。全部从自己的模型或前端解决方案创建。如果您知道,我将不胜感激。
  • 您有多少客户?为您的客户提供一个主布局页面,然后为每个客户提供单独的自定义视图是一种完全可以接受的方法。.. 当然,除非您有很多不同的客户,都有不同的要求。
  • 我以前用过的任何东西都是完全定制的并且是内部建造的,所以我不能给你推荐一些野外的东西。在任何情况下,直接推荐在 SO 上都被认为是题外话,部分原因是您往往会收到意见和营销垃圾邮件,部分原因是该网站的目的是针对特定编程问题的问答,而不是研究中心。
  • @hhk - 我会选择数据驱动的解决方案。创建存储在数据库中的 XML 配置。然后,您可以创建有关要创建哪些控件以及它们是可见还是只读的元数据。

标签: c# jquery asp.net-mvc razor


【解决方案1】:

这是我们的解决方案:

我们创建了一个模型类来将设置存储在数据库中,命名为 CustomModelEditor。我们还创建了一个公共类,用于在 Razor 视图端创建我们自己的 @Html 方法,并将其命名为 CustomWebForm

CustomWebForm 类中,我们创建了一个返回 MvcHtmlString 值的方法,并使用 InputExtensions 覆盖了 html 输入。请参阅下面的代码。

    public static MvcHtmlString MyTextBox(this HtmlHelper html, CustomModelEditor property, object additionalViewData = null)
        {

            dynamic htmlattr = additionalViewData ?? new ExpandoObject();

            htmlattr.@class = "form-control";
            htmlattr.type = property.InputType.ToString().ToLower();

            if (property.IsRequired)
                htmlattr.required = "required";
            if (property.IsReadonly)
                htmlattr.@readonly = "readonly";
            if (property.IsDisabled)
                htmlattr.disabled = "disabled";
            if (property.Length != 0)
                htmlattr.maxlength = property.Length;
            if (property.Value == null)
                property.Value = property.DefaultValue;

            htmlattr.value = property.Value;

            return InputExtensions.TextBox(html, property.Name, property.Value, htmlattr);
        }

我有这个用于标签、复选框和其他 html 元素。

在控制器上,我们创建了一个ExpandoObject,以便从数据库传递输入设置。

    public ActionResult Test()
    {

        dynamic contact = new ExpandoObject();

        // this part is static for now, will be get input settings from database
        contact.Name = new CustomModelEditor();
        contact.Name.Value = null;
        contact.Name.Name = nameof(contact.Name);
        contact.Name.DefaultValue = "Not Set";
        contact.Name.IsRequired = true;

        contact.Email = new CustomModelEditor();
        contact.Email.Name = nameof(contact.Email);
        contact.Email.Value = "";
        contact.Email.InputType = DataModels.InputType.Email;
        contact.Email.DefaultValue = "";
        contact.Email.IsRequired = true;

        return View(contact);
    }

在 view.cshtml 的 Razor 端,我只是调用了 MyTextBox 方法。

@using MyWebProject.DataModels
@using System.Dynamic

@model dynamic

@{
    ViewBag.Title = "Test";
}

<form>

    @Html.MyTextBox((CustomModelEditor)Model.Name)
    @Html.MyTextBox((CustomModelEditor)Model.Email)
    <button type="submit">test</button>
</form>

【讨论】:

    【解决方案2】:

    您可以为每个客户创建一个 CustomerValidation 实体,并将每个客户的所有验证存储在数据库中。 在您的 API 中,您可以创建一个服务来检查验证并根据客户模板在任何验证失败时返回带有错误的模型。

    public class CustomerValidation
    {
       public string propertyName {get;set;}
       public string validationRegex {get;set;}
       public string ValidationMessage {get;set;}
       public int ID {get;set;}
       public int CustomerId {get;set;}
       public virtual Customer CustomerInfo {get;set;}
    }
    

    CustomerValidation 的示例条目可以是

    Name, ^[a-zA-Z ]*$ ,Name should start with letter 
    

    【讨论】:

    • 我认为 op 没有说任何关于验证的事情
    • @Usman 验证也是一种情况。但是,我正在寻找一种解决方案,使客户可以从属性创建表单。但是感谢 Nitin,我最终会需要这个。
    • @hhk 您还可以使用此实体创建表单并在 CustomerValidation 中插入 Fields Visible 条目,或者您可以将此实体重命名为 CustomerDynamicFieldsAttributes ,在开发视图时,您可以检查任何字段,如果该字段需要显示或需要。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多