2013-06-02 7 views
0

아약스를 사용하여 동적으로 필드 목록에 항목을 추가하고 있습니다.아약스를 사용하여 양식에 필드 추가하기

문제는 이러한 항목에 올바른 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-list"> 
    @Html.EditorFor(model => model.Fields) 
</div> 
<p> 
    <span class="add-field">Add Field</span> 
</p> 

:

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

섹션이 같은 EditorTemplate있다 Field에는 다음과 같은 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입니다.

이것은 분명히 잘못되었습니다. 그것은 올바른 ID/이름을 제공하는 자바 스크립트를 사용하여 페이지에 추가하기 전에 내 HTML을 수정할 수있는 것 같지만 정말 끔찍한 솔루션입니다. 올바른 이름과 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로 Field를 추가하고 있습니다. 그러나 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

AJAX를 통해로드하는 HTML 서버 측 (유효성 검사 등을 받기 위해)을 작성하여 필드를 추가해야하는 경우 이름을 어떻게 다르게 할 수 있습니까? 그렇지 않으면 그들은 동일한 것을 반환하고 하나의 필드의 유효성을 검사하여 새로 추가 된 모든 필드의 유효성을 검사합니다. – Jon

관련 문제