2011-08-30 47 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) –