ASP MVC 3 RAZOR пост создания динамической формы - PullRequest
2 голосов
/ 30 августа 2011

Я пытаюсь создать страницу asp mvc 3 с формой с текстовыми полями, которые динамически генерируются на основе номера объекта в списке, который находится в модели, которую я передал в контроллер страницы. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я отправляю сообщение в контроллер, список поддерживает значения, но не имена объектов в списке. Вот пример:

Модель:

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 , но ответ сталкивается с теми же проблемами, что и я. Надеюсь, я проясню! Если нет, я выложу больше информации. Спасибо!

1 Ответ

7 голосов
/ 30 августа 2011

Вы можете включить эти имена в качестве скрытых полей.Таким образом, их значения будут опубликованы в действии контроллера:

@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.

...