Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在mvc中基于模型动态创建动态表单?_C#_Jquery_Asp.net Mvc_Razor - Fatal编程技术网

C# 如何在mvc中基于模型动态创建动态表单?

C# 如何在mvc中基于模型动态创建动态表单?,c#,jquery,asp.net-mvc,razor,C#,Jquery,Asp.net Mvc,Razor,我们有一些客户希望以不同的方式使用网页。如果我更清楚的话,假设我们有一个Person模型,这个模型显然有一些属性,比如姓名、号码、地址等 客户X希望属性名称符合要求,编号不可见,地址为只读 客户Y希望财产名称符合要求,编号符合要求,地址不可见 其他客户对这些页面的要求不同 我不想为每个客户创建一个页面。因此,正如我所看到的,我可能需要动态网页生成器之类的东西,它可以为我们的客户提供基于该模型的定制页面 你觉得我怎么处理这件事?MVC或jQuery中是否有开源解决方案?任何其他建议?您可以为每个客

我们有一些客户希望以不同的方式使用网页。如果我更清楚的话,假设我们有一个Person模型,这个模型显然有一些属性,比如姓名、号码、地址等

客户X希望属性名称符合要求,编号不可见,地址为只读

客户Y希望财产名称符合要求,编号符合要求,地址不可见

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

我不想为每个客户创建一个页面。因此,正如我所看到的,我可能需要动态网页生成器之类的东西,它可以为我们的客户提供基于该模型的定制页面


你觉得我怎么处理这件事?MVC或jQuery中是否有开源解决方案?任何其他建议?

您可以为每个客户创建一个CustomerValidation实体,并将每个客户的所有验证存储在DB中。 在您的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 
以下是我们的解决方案:

我们创建了一个模型类来存储数据库中的设置,名为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元素

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

    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中,我只是调用了MyTextBox方法


该用例可能在某种程度上类似于表单生成器或问卷生成器软件,其中有很多在线示例,有些是商业示例,有些不是。我不打算为您做所有的研究,但您可能会找到一些与MVC兼容的东西,或者有自己的模型和验证结构,这意味着您不太需要MVC的模型部分。@ADyson在询问之前,我已经快速查看了一下,但是我发现的任何解决方案都不是基于MVC模型的。所有这些都是从自己的模型或前端解决方案创建的。如果你知道的话,我将不胜感激。你有多少客户?为您的客户提供一个主布局页面,然后为每个客户提供单独的定制视图,这是一种完全可以接受的方法。。当然,除非你有很多不同的客户,他们都有不同的要求。我以前用过的任何东西都是完全定制的,而且是内置的,所以我不能给你推荐野外的东西。在任何情况下,直接推荐都被认为是离题的,部分原因是你倾向于获得意见和营销垃圾邮件,部分原因是该网站的目的是针对特定编程问题的问答,而不是研究中心。@hhk-我会选择数据驱动的解决方案。创建存储在数据库中的XML配置。然后,您可以创建元数据,包括要创建的控件以及它们是可见的还是只读的validation@Usman验证也是一个例子。但是,我正在寻找一种解决方案,使客户从属性创建表单。但感谢Nitin,我会在一天结束时需要它。@hhk您也可以使用此实体创建表单并在CustomerValidation中插入字段可见项,或者您可以将此实体重命名为CustomerDynamicFieldsAttributes,在开发视图时,如果需要显示或需要该字段,您可以检查任何字段。
@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>