2013-06-02 44 views
0

我正在使用ajax動態添加項目到字段列表。使用ajax將字段添加到表單

問題是這些項目沒有正確的ID或名稱,因此它們無法正確映射,並且在提交表單時未反映到模型中。

這是我的代碼的結構:

public class Main 
{ 
    public IEnumerable<FieldSection> Sections { get; set; } 
} 

public class FieldSection 
{ 
    public virtual IList<Field> Fields { get; set; } 
} 

public class Field 
{ 
    [Required] 
    public string Value { get; set; } 
} 

這是我如何渲染主營:

<div class="field-sections"> 
    <div id="sections"> 
     @Html.EditorFor(model => model.Sections) 
    </div> 
    <p> 
     <span class="add-section">Add Section</span> 
    </p> 
</div> 

的一節,像這樣的EditorTemplate:

<div class="field-list"> 
    @Html.EditorFor(model => model.Fields) 
</div> 
<p> 
    <span class="add-field">Add Field</span> 
</p> 

字段有這樣的EditorTemplate:

<div class="editor-field"> 
    @Html.LabelFor(model => model.Value) 
    @Html.EditorFor(model => model.Value) 
    @Html.ValidationMessageFor(model => model.Value) 
</div> 

如果我有一個部分和兩個字段,Value字段的最後一個文本框的ID爲Sections_0__Fields_1__Value,名稱爲Sections[0].Fields[1].Value

我通過渲染我的EditorTemplate Field.cshtml將ajax添加到Field,將其返回到頁面並將其添加到該部分。但是ID將爲Value,名稱將爲Value

這顯然是不正確的。看起來我可以修改我的HTML,然後使用javascript將它添加到頁面中,以便爲其提供正確的ID /名稱,但這是一個非常糟糕的解決方案。如何讓我的視圖使用正確的名稱和ID進行呈現?或者我以錯誤的方式接近這個?

編輯

渲染域代碼:

[HttpGet] 
public string Field() 
{ 
    return MvcRenderUtility.RenderToString(this, "EditorTemplates/TemplateField", new TemplateField()); 
} 

而且渲染實用程序:

public static class MvcRenderUtility 
{ 
    public static string RenderToString(Controller controller, string viewName, object model) 
    { 
     if (string.IsNullOrEmpty(viewName)) 
      viewName = controller.ControllerContext.RouteData.GetRequiredString("action"); 

     controller.ViewData.Model = model; 

     using (StringWriter sw = new StringWriter()) 
     { 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
      ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 
} 
+0

*我通過渲染我的EditorTemplate Field.cshtml來添加一個字段ajax,將其返回到頁面並將其添加到該部分。然而,ID將是Value並且名稱將是Value。* - 代碼在哪裏? –

+0

以上爲你添加了它,謝謝。 – Jon

回答

0

我建議你在瀏覽器中添加字段,可能使用jQuery,並檢索值後處理方法中的新字段:

public ActionResult Edit(MyModel model, FormCollection raw) { 

    // scan the raw collection for new fields and add them to your model 

} 
+0

如果我需要通過創建HTML服務器端(選擇驗證等)來添加我的字段,通過AJAX加載,我將如何使名稱不同?否則,它們會返回相同的數據,並驗證一個字段驗證所有新添加的字段。 – Jon