forms - ASP MVC 3 RAZOR动态表单生成贴

标签 forms asp.net-mvc-3 razor http-post

我正在尝试创建带有文本字段的表单的 asp mvc 3 页面,这些文本字段是根据我传递到页面 Controller 的模型中的列表中的对象数量动态生成的。我遇到的问题是,每当我发布到 Controller 时,列表都会维护值而不是列表中对象的名称。这是一个例子:

模型:

public class SomeModel
    {
        List<Field> fieldList;
        public SomeeModel()
        {
            fieldList = new List<Field>();
        }


        public string Name { get; set; }

        public List<Field> FieldList
        {
            get
            {
                return fieldList;
            }
        }

    }

Controller :

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);
}

View :

@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但答案遇到了和我一样的问题。希望我说清楚了!如果没有,我会发布更多信息。谢谢!

最佳答案

您可以将这些名称包含为隐藏字段。这样它们的值将被发布到 Controller 操作:

@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>
}

以及将为 FieldList 集合的每个元素呈现的相应编辑器模板 (~/Views/Shared/EditorTemplates/Field.cshtml):

@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 中。

关于forms - ASP MVC 3 RAZOR动态表单生成贴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7247276/

相关文章:

css - 仅更改特定表单的字段错误样式

c# - 如何首先循环遍历 Entity Framework 4.1 代码中的子对象列表

php - 可以使用上传表单将病毒上传到服务器吗?会产生什么影响?

php - 如何更改未选中的框错误。 (HTML)

javascript - 检测形式变化

c# - 使用ajax后返回同一 Controller 的另一个MVC3 View

asp.net-mvc-3 - 自定义成员提供程序中的 Unity 依赖注入(inject)

c# - 在 blazor 中改变组件属性的正确方法

asp.net-mvc - 考虑逻辑是不是不好的做法

Javascript对象负数