Это действительная модель для такого представления? - PullRequest
0 голосов
/ 08 февраля 2019

Это правильная модель?

public class NewForm
{
    public string[] Field { get; set; }
    public bool[] Check { get; set; }
}

для такого ВИДА:

@Html.TextAreaFor(model => model.Field)
@Html.TextAreaFor(model => model.Field)
@Html.TextAreaFor(model => model.Field)

@Html.CheckBoxFor(model => model.Check)
@Html.CheckBoxFor(model => model.Check)

Или есть лучший способ создать поля с одинаковыми именами?В контроллере отображается только первое значение.Но мне нужны все

        [HttpPost]

    public ActionResult Edit(NewForm model)
    {
        Response.Write(model.Field);
        Response.Write(model.Check);
    }

Поля могут быть неопределенным числом из-за того, что при нажатии на кнопку JavaScript добавляет новое поле с тем же именем с тем же именем

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Нет, это не так.В определенной вами модели вы создали два разных массива: первое свойство Field представляет собой массив строк, а второе свойство Check - массив значений bools.размещение [] после типа указывает на массив.

Если у вас есть неизвестное число того, что я назову «мини-формами», и количество их определяется пользователем через пользовательский интерфейс, то вам нужно создать модель представления для представления этой мини-формы, имодель представления контейнера для размещения его и любые другие свойства, которые понадобятся вашему представлению.

Например:

public class MiniFormViewModel
{
    public string MyInput { get; set; }
    public bool MyCheck { get; set; }
}

затем в вашей модели представления контейнера:

public class ContainerViewModel
{ 
    public IEnumerable<MiniFormViewModel> MiniForms { get; set; } 
    //Any other properties you need on the view that will occur a single time 
}

Теперь в JS вам нужно добавить некоторые манипуляции, чтобы сделать это:

function getViewModel() {
    //You'll have to decide how you want to get the values of the mini form's fields. Perhaps you might even have a function to supply these values. Up to you.
    return {
        MiniForms: [{
                MyInput: '', //value from the first "mini form' string field
                Mycheck: false //value from the first "mini-form" bool field
            },
            {
                MyInput: '', //value from the second"mini form' string field
                Mycheck: false //value from the second"mini-form" bool field
            }      
        ]
    }
}

Затем вам нужно будет отправить это обратно на сервер.Я продемонстрирую, как это сделать, с помощью встроенной функции JS Fetch:

        fetch(yourUrlForTheControllerAction,
            {
                method: 'post',
                body: JSON.stringify(getViewModel()),
                headers: {
                    'content-type': 'application/json; charset=UTF-8'
                }
            })

А затем, чёрт возьми, вам пора идти.Я исключил часть динамического добавления полей мини-формы, потому что, похоже, у вас уже есть решение для этого.

0 голосов
/ 08 февраля 2019

Это звучит , как будто вы хотите отправить несколько экземпляров вашего model обратно на контроллер.

Вы могли бы сделать что-то вроде этого.Мой пример отправит 10 экземпляров Field обратно на ваш контроллер.

Вид:

@using (Html.BeginForm())
{
    <div>
    @for(int i = 0; i<10; i++) 
    {
        <div>@Html.TextBox("items[" + i + "].Field", "", new { id = "items[" + i + "].Field", placeholder = "Enter Text..." })</div>
        @Html.Hidden("items.Index", i)
    }
    </div>
    <input type="submit" value="Submit" />
}

Класс:

public class MyClass 
{
    public string Field {get;set;}
}

Метод контроллера:

[HttpPost]
public ActionResult ActionName(List<MyClass> items)
{
   //...do stuff
}

Очевидно, что вы также можете добавить свой флажок в модель и форму, чтобы отправить многие из них.

0 голосов
/ 08 февраля 2019

Почему вы хотите использовать одно и то же имя для полей, каждое поле имеет правильное имя

public class NewForm
{
    public string FirstField { get; set; }
    public string Field { get; set; }
    public bool Check { get; set; }
}

ПРОСМОТР

@Html.TextAreaFor(model => model.FirstField)
@Html.TextAreaFor(model => model.Field)

@Html.CheckBoxFor(model => model.Check)

ee

[HttpPost]
public ActionResult Edit(NewForm model)
{
    Response.Write(model.FirstField);
    Response.Write(model.Field);
    Response.Write(model.Check);
}
...