0

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>

Section には、次のような EditorTemplate があります。

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

Field には、次のような EditorTemplate があります。

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

1 つのセクションと 2 つのフィールドがある場合、フィールドの最後のテキスト ボックスValueの IDSections_0__Fields_1__Valueと名前はSections[0].Fields[1].Valueです。

FieldEditorTemplate をレンダリングして ajax を追加し、Field.cshtmlそれをページに戻し、セクションに追加します。ただし、ID は にValueなり、名前は になりますValue

これは明らかに間違っています。HTML をページに追加する前に、javascript を使用して正しい 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();
        }
    }
}
4

1 に答える 1