如何动态创建表单?

时间:2014-01-31 21:26:25

标签: c# html .net asp.net-mvc-3

以下是(摘要)业务问题:

在每周开始时,预报员估计他们将按类别销售多少糖果。

类别可以是“巧克力棒”或“小熊”。每周(有时每天),可以添加或删除类别。

预报员会查看每个类别并提供估算值。

我的视图模型如下:

    public class estimate
    {        
        public int Id { get; set; }
        public string forecasterName { get; set; }
        public int forecasterPrediction { get; set; }
        public int salesDeptPrediction { get; set; }
        public int financeDeptPrediction { get; set; }
    }

我的数据库在Entity Framework中完全相同。

我们说数据库有以下几行:

1 | Bob Forecaster | [null] | 4500 | 4000

2 | Hank Forecaster | [null] | 4500 | 4000

3 | Ike Forecaster | [null] | 4500 | 4000

如何动态创建一个读取此数据库中实例数的表单,并在表中写出包含上述所有信息的表单,每个“[null]”是一个@ Html.EditorFor项?< / p>

1 个答案:

答案 0 :(得分:1)

要非常清楚,您不要“动态创建表单”。您可以创建一个将根据其提供的数据动态填充的表单。

首先,您需要创建一个与EditorTemplate目录中的ViewModel类名称相匹配的EditorTemplate:

/Views/Shared/EditorTemplates/estimate.cshtml

EditorTemplate中的表单将如下所示:

@using(Html.BeginForm("MyAction", "MyController"))
{
    @Html.DisplayFor(m => m.Id)
    @Html.DisplayFor(m => m.forecasterName)
    @Html.TextBoxFor(m => m.forecasterPrediction)
    @Html.DisplayFor(m => m.salesDeptPrediction)
    @Html.DisplayFor(m => m.financeDeptPrediction)
    <button type="submit">Submit</button>
}

这就像它将要获得的那样简单。每个Html.DisplayFor()调用只显示传递给EditorTemplate的Model中包含的值,Html.TextBoxFor()调用将生成一个TextBox,当在表单中提交时,它将自动绑定到ViewModel属性。用来创造它。

现在,要实际使用这个EditorTemplate,您需要在包含相关ViewModel本身的View或其他具有相关ViewModel属性的类中调用它。

我将演示使用estimate类的单个实例和estimate s的集合:

@model estimate

@Html.EditorFor(m => Model)

该视图除了显示estimate类的EditorTemplate外,不会执行任何其他操作。

以下内容将显示您发送到视图的每个estimate的表单:

@model IEnumerable<estimate>

@foreach(var estimate in Model)
{
    @Html.EditorFor(m => estimate)
}

请注意上面的示例,一旦您提交表单,该页面将执行完整的回发,这意味着它将在您发送任何更多数据之前刷新。有一些替代方案,比如使用AJAX,但为了答案,我保持简单。

由于您询问了表单本身,我假设您已经知道如何从数据库中提取相关数据并使用Controller Action将其发送到View。我还假设您知道如何正确引用MVC中的视图的命名空间。