ASP MVC 3 RAZOR动态表单生成帖子

Pet*_*zah 2 forms http-post razor asp.net-mvc-3

我正在尝试使用带有文本字段的表单创建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;
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

控制器:

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);
}
Run Code Online (Sandbox Code Playgroud)

风景:

@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>
Run Code Online (Sandbox Code Playgroud)

我在这里看到了类似的帖子.NET MVC Razor动态表单生成,但答案遇到了与我相同的问题.希望我清楚!如果没有,我会发布更多信息.谢谢!

Dar*_*rov 7

您可以将这些名称包含为隐藏字段.这样他们的值将被发布到控制器动作:

@for (var i = 0; i < Model.FieldList.Count(); i++)
{    
    @Html.HiddenFor(model => Model.FieldList[i].name)
    ...
}
Run Code Online (Sandbox Code Playgroud)

而不是编写这些循环,我建议你使用编辑器模板:

@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>
}
Run Code Online (Sandbox Code Playgroud)

以及~/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>
Run Code Online (Sandbox Code Playgroud)

另一种可能性而不是使用隐藏字段将这些名称外部化到某个数据存储中,然后有一个存储库可以返回它们.因此,在您的两个操作中,您只需查询此存储库中的名称.因为它们无法更改,所以不必将它们包含在HTML中.