2011-08-30 71 views
2

我想创建asp mvc 3页面,带有基于列表中对象的数量动态生成的文本字段,该列表位于我传入页面控制器的模型中。我遇到的问题是每当我发布到控制器时,列表都会维护这些值,而不是列表中对象的名称。这里有一个例子:ASP MVC 3 RAZOR动态表单生成后

的型号:

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

回答

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

+1

谢谢!完美工作! – Petezah

+0

如何在代码中设置hiddenfield的值?例如:如何设置这一个@ Html.HiddenFor(model => model.name) –