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