【问题标题】:Generate form from database in MVC在 MVC 中从数据库生成表单
【发布时间】:2016-10-30 05:18:56
【问题描述】:

我正在尝试从我的数据库生成表单。

CREATE TABLE [dbo].[FieldsMaster](
    [FieldId] [int] IDENTITY(1,1) NOT NULL,
    [FieldControlName] [varchar](50) NULL,
    [FieldDataType] [varchar](20) NULL,
    [FieldControlType] [varchar](30) NULL,
    [DisplayLabel] [varchar](200) NULL,
    [FieldSize] [int] NULL,
    [FieldRegularExpression] [varchar](200) NULL,
    [FieldOptions] [varchar](500) NULL,
    [OptionalQuery] [varchar](200) NULL,
    [REMessage] [varchar](150) NULL,
    [FieldRequired] [bit] NULL,
    [FRMessage] [varchar](150) NULL  
)

为表格生成一些数据

insert into FieldsMaster (FieldControlName,FieldDataType,FieldControlType,DisplayLabel,FieldSize,FieldRegularExpression,
FieldOptions,OptionalQuery,REMessage,FieldRequired,FRMessage,IsActive)
values
('txtOtherInfo','varchar','TextArea','Other Information',400,NULL,
NULL,NULL,NULL,0,NULL)

insert into FieldsMaster (FieldControlName,FieldDataType,FieldControlType,DisplayLabel,FieldSize,FieldRegularExpression,
FieldOptions,OptionalQuery,REMessage,FieldRequired,FRMessage,IsActive)
values
('txtTitle','varchar','TextBox','Title',100,NUll,
NULL,NULL,NULL,1,'Please enter title')

现在这个带有字段的表单存储在我的 sql 数据库中。我想在 mvc 中生成一个表单。模型应该如何形成/如何在视图中生成表单? 我在这里真的很困惑。非常感谢您的帮助。谢谢

为了有更多的想法,下面的表单应该根据 FieldsMaster 中的字段显示

Other Information(as label) : TextArea (With Id as txtOtherInfo)
Title (as Label)            : TextBox (With Id as txtTitle)

【问题讨论】:

  • 使用 EITHER 数据库优先或代码优先生成模型 .Database-first:e.g. Code-first:e.g.
  • 你的问题也有点不清楚,form 是什么意思?
  • @ShawnYan,我的表单是指用户的数据输入表单。我应该说清楚,我没有使用实体框架。我正在使用 Dapper.Net。数据输入表单应根据表中创建的字段生成
  • 例如,在 FieldsMaster 中定义了两个字段,视图应该生成一个 id=txtOtherInfo 的 textArea 和一个 id=txtTitle 的 TextBox 和必填字段

标签: sql-server asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

如果你想直接从数据库中添加表单,你可以这样做。

首先,您需要对这样的枚举进行建模(对于电子邮件):

    public int EmailTemplateId { get; set; }
    public int Type { get; set; }
    public string Name { get; set; }    

public enum Emailtype
{
    Base = 0,
    Recovery = 1,
    NewAccount = 2,
    ChangePassword = 3,
    BlockAccount = 4,
    UnlockAccount = 5,
    ForgetPassword = 6
  }

所以你们每个人都代表一个不同的模板,在你的模板视图中你有类似的东西

<body>
//some code of your template
{-container-}
</body>

如您所见,{-container-} 是您为每个模板更改的属性。所以你制作了新的容器,你可以像

一样将它们插入到 sql 中
<tr>
 <td>Hi {name}. Your password is {password}</td>
</tr>

这里不需要标签,因为你已经在你的第一个模板和这段代码中加入了标签

在控制器中:

   public void NewAccount(string name, string email,string password, string user)
    {

        var from = model.From;
        var loginUrl = model.LoginUrl;
        const string title = "New Register - Stackoverflow";

           EmailsService sendEmail = new EmailsService
        {
            Subject = title,
            To = email,
            From = from
        };
}

          //There is our first template (Base template)
        var templateBase = Get(Emailtype.Base);
          //This one is template who changes (container)
        var templateText = Get(Emailtype.NewAccount);

     //Here you replace Name property of class for your container code
           var body = templateBase.Name.Replace("{-container-}", templateText.Name);


           sendEmail.EmailBody = body.Replace("{Name}", name)
            .Replace("{Title}", title)
            .Replace("{User}", user)
            .Replace("{Password}", password)
            .Replace("{Link}", loginUrl);
        sendEmail.Send();
    }    

最后,你可以在你的 sql 中插入你的容器的代码......它显示如下:

EmailTemplateId=1
Type= 1 //(Recovery ones)
Name=    <tr> <td>Hi {name}. Your password is {password}</td> </tr>

希望对你有帮助!

【讨论】:

  • 感谢格里的评论。实际上这个动态数据输入表单生成背后的想法是,从管理面板用户可以添加任何字段(因此不能在设计时对其进行硬编码,用户可以在运行时添加尽可能多的字段)。此外,我需要保存数据哪个用户将在此字段中输入,我需要查询这些字段。您对模板的想法很好,但不幸的是它不适用于我的情况。任何想法...
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多