以下是(摘要)业务问题:
在每周开始时,预报员估计他们将按类别销售多少糖果。
类别可以是“巧克力棒”或“小熊”。每周(有时每天),可以添加或删除类别。
预报员会查看每个类别并提供估算值。
我的视图模型如下:
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>
答案 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中的视图的命名空间。