1

カスタムフィールドのグループを持つ動的フォームを配置しています

したがって、メインのフォーム(フォーム)オブジェクトにはグループ化(グループ)のリストがあり、これらのグループ化にはそれぞれカスタムフィールド(フィールド)のリストがあり、グループ化は主にカスタムフィールドを見出しなどの列に表示するために使用されます.

私の問題は、新しいグループ化ごとに、カスタム フィールドのカウンターがリセットされて 0 に戻ることです。これは、コントローラーにポストされるデータに関しては、名前属性が重複しているため正しくポストされないことを意味します。 .

グループをポストバックする必要がないため、現在、フィールドのリストをポストバックしています。

私がこれを行うことができるさまざまな方法の解決策はありますか? これは明らかに間違っていますか?

以下のコード例では、このフォーム用に生成された HTML から 4 つの入力コントロールが得られますが、一意のコントロール名は 2 つだけです。 2 つには "name="group.Fields[1].Result"" があり、コントローラーにポストバックされたときに明らかに機能しません。

編集:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FieldsPoC.Models;

namespace FieldsPoC.Controllers
{
    public class FormController : Controller
    {
        public ActionResult Index()
        {
            FormViewModel model = new FormViewModel();

            var group = new GroupViewModel();
            group.Label = "Group 1";
            group.Fields.Add(new FieldViewModel() { Label = "Field 1", Type = FieldType.Number });
            group.Fields.Add(new FieldViewModel() { Label = "Field 2", Type = FieldType.Text });
            model.Groups.Add(group);

            group = new GroupViewModel();
            group.Label = "Group 2";
            group.Fields.Add(new FieldViewModel() { Label = "Field 1", Type = FieldType.DateTime });
            group.Fields.Add(new FieldViewModel() { Label = "Field 2", Type = FieldType.Number });
            model.Groups.Add(group);

            return View(model);
        }

        [HttpPost]
        public ActionResult Index([Bind(Prefix = "Contact")]ContactViewModel contact, List<GroupViewModel> fields)
        {

            return View();
        }
    }
}

namespace FieldsPoC.Models
{
    public class ContactViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

namespace FieldsPoC.Models
{
    public class ContactViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

namespace FieldsPoC.Models
{
    public class GroupViewModel
    {
        public GroupViewModel()
        {
            Fields = new List<FieldViewModel>();
        }

        // Other layout properties
        public string Label { get; set; }
        public List<FieldViewModel> Fields { get; set; }
    }
}

namespace FieldsPoC.Models
{
    public enum FieldType
    {
        Text = 0,
        Number = 1,
        DateTime = 2
    }

    public class FieldViewModel
    {
        public FieldType Type { get; set; }
        public string Label { get; set; }
        public string Result { get; set; }
    }
}

フォームインデックス:

@model FieldsPoC.Models.FormViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @using (Html.BeginForm("", "Form"))
        {
            @Html.ValidationSummary(true)

            @Html.EditorFor(model => model.Contact)

            foreach (var group in Model.Groups)
            {
            @Html.EditorFor(x => group);
            }

            <p>
                <input type="submit" value="Save" />
            </p>
        }
    </div>
</body>
</html>

EditorTemplates:

@model FieldsPoC.Models.ContactViewModel
<div class="editor-label">
    @Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.FirstName)
    @Html.ValidationMessageFor(model => model.FirstName)
</div>
<div class="editor-label">
    @Html.LabelFor(model => model.LastName)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.LastName)
    @Html.ValidationMessageFor(model => model.LastName)
</div>

@model FieldsPoC.Models.FieldViewModel
<div class="editor-label">
   @Model.Label
</div>

@{ 
    switch (Model.Type)
    {
        case FieldsPoC.Models.FieldType.DateTime:
            @Html.TextBoxFor(model => model.Result);
            break;
        case FieldsPoC.Models.FieldType.Number:
            @Html.TextBoxFor(model => model.Result);
            break;
        case FieldsPoC.Models.FieldType.Text:
            @Html.TextBoxFor(model => model.Result);
            break;
    }
}

@model FieldsPoC.Models.GroupViewModel
<fieldset>
    <legend>@Model.Label</legend>
    @Html.EditorFor(model => model.Fields)
</fieldset>

見出し

4

0 に答える 0