我尝试使用带有文本字段的表单创建asp mvc 3页面,该表单是根据我传递到页面控制器的模型中列表中的对象数量动态生成的。我遇到的问题是,每当我发布到控制器时,列表都会保留值,但不会保留列表中对象的名称。这是一个例子:
模特:
public class SomeModel
{
List<Field> fieldList;
public SomeeModel()
{
fieldList = new List<Field>();
}
public string Name { get; set; }
public List<Field> FieldList
{
get
{
return fieldList;
}
}
}
控制器:
public ActionResult Preview()
{
SomeModel model = new SomeModel();
model.FieldList.Add( new Field { name = "test 1"});
model.FieldList.Add( new Field { name = "test 2"});
model.FieldList.Add( new Field { name = "test 3"});
return View(model);
}
观点:
@using (Html.BeginForm()) {
<div>
<fieldset>
<legend>Input Field List</legend>
@for (var i = 0; i < Model.FieldList.Count(); i++)
{
<div class="editor-label">
@Html.Label(Model.FieldList[i].name)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => Model.FieldList[i].value)
</div>
}
<p>
<input type="submit" value="Generate PDF" />
</p>
</fieldset>
</div>
我在这里看到了类似的帖子.NET MVC Razor Dynamic Form Generation,但答案与我得到的问题相同。希望我清楚!如果不是,我会发布更多信息。谢谢!
答案 0 :(得分:7)
您可以将这些名称包含为隐藏字段。这样,它们的值将被发布到控制器操作:
@for (var i = 0; i < Model.FieldList.Count(); i++)
{
@Html.HiddenFor(model => Model.FieldList[i].name)
...
}
除了编写这些循环外,我还建议您使用编辑器模板:
@model SomeModel
@using (Html.BeginForm())
{
<div>
<fieldset>
<legend>Input Field List</legend>
@Html.EditorFor(x => x.FieldList)
<p>
<input type="submit" value="Generate PDF" />
</p>
</fieldset>
</div>
}
以及将为~/Views/Shared/EditorTemplates/Field.cshtml
集合的每个元素呈现的相应编辑器模板(FieldList
):
@model Field
@Html.HiddenFor(model => model.name)
<div class="editor-label">
@Html.LabelFor(model => model.value, Model.name)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.value)
</div>
除了使用隐藏字段之外,另一种可能性是将这些名称外部化到某个数据存储中,然后拥有一个可以返回它们的存储库。因此,在您的两个操作中,您只需查询此存储库中的名称。因为它们无法更改,所以不必将它们包含在HTML中。