Динамическое заполнение формы на основе пользовательского ввода в ASP.Net MVC

Мой вопрос похож на здесь Энграма, но мой вопрос идет немного дальше. Я предполагаю, что у меня есть текстовое поле с вопросом, сколько записей собирается сделать пользователь. После того, как они введут номер, мне нужно создать еще столько текстовых полей, чтобы разрешить записи (а затем повторить тот же процесс с этими текстовыми полями, но сначала детские шаги ...) Я попытался собрать ключи в сообщении, но он только возвращает начальное текстовое поле с запросом количества записей. Я все еще пытаюсь разобраться в MVC, и учебные пособия / видео пока еще не вникают в это глубоко. Опять же, я знаю, что, вероятно, с этим я смогу справиться с помощью JQuery, но я все равно застрял бы в той же ситуации.

Это контроллер, который я использую:

[AcceptVerbsAttribute("POST")]
    public ActionResult Create(int tbxNumberOfExercises)
    {
        ViewData["number"] = tbxNumberOfExercises;
        foreach (var key in Request.Form.Keys)
        {
            string keyString = key.ToString();
            if (keyString.StartsWith("tbox_exercise", StringComparison.OrdinalIgnoreCase))
            {
                string recNum = keyString.Substring(13, keyString.Length - 13);
                string approvedKey = Request.Form["tbox_exercise" + recNum];
                int number;
                int.TryParse(approvedKey, out number);
            }
        }
        return View("Create");
    }

А это мой aspx:

<form action = "/CreateWorkout/Create" method = "post">
Number of Exercises:
<%= Html.TextBox("tbxNumberOfExercises") %>
<br />
<br />
<input type = "submit" value = "Set Exercise Number" />
</form>
<% if (ViewData["number"] != null)%>
There are this many:<%=Html.Encode(ViewData["number"])%>
<br />
and this line should show up
<% if (ViewData["number"] != null)
   {
       int max = (int)ViewData["number"];

       for (int i = 0; i < max; i++)
       {%>
          <br />
          <br />
          <%= Html.TextBox("tbox_exercise" + i) %>
    <% }
   } %>
<% if (ViewData["s"] != null) %>
<%=Html.Encode(ViewData["s"]) %>

Есть ли что-то, что я не замечаю, не понимаю, или мне стоит бросить курить, пока я занимаюсь этим, потому что мне кажется, что я никогда этого не пойму?

Заранее благодарим за любую помощь - я просто пытаюсь узнать как можно больше.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
4 831
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я бы разбил это на этапы, вам нужно будет добавить представление «Сохранить» где-нибудь в зависимости от того, что вы хотите.

Скотт

<form action = "/Demo01/Create" method = "post">
Number of Exercises:
<%= Html.TextBox("tbxNumberOfExercises") %>
<br />
<br />
<input type = "submit" value = "Set Exercise Number" />
</form>
<% if (ViewData["number"] != null) {%>
<form action = "/Demo01/Save" method = "post">
There are this many:<%=Html.Encode(ViewData["number"])%>
<br />
and this line should show up
<% if (ViewData["number"] != null) {
       int max = (int)ViewData["number"];

       for (int i = 0; i < max; i++) {%>
<br />
<br />
<%= Html.TextBox("tbox_exercise" + i) %>
<% }
   } %>
<% if (ViewData["s"] != null) %>
<%=Html.Encode(ViewData["s"]) %>
<input type = "submit" value = "Save Exercises" />
<% } %>
</form>

А затем в вашем контроллере что-то вроде этого:

public class Demo01Controller : Controller {
    public ActionResult Create() {
        return View();
    }

    [AcceptVerbsAttribute("POST")]
    public ActionResult Create(int tbxNumberOfExercises) {
        ViewData["number"] = tbxNumberOfExercises;
        return View("Create");
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Save() {
        foreach (var key in Request.Form.Keys) {
            string keyString = key.ToString();
            if (keyString.StartsWith("tbox_exercise", StringComparison.OrdinalIgnoreCase)) {
                string recNum = keyString.Substring(13, keyString.Length - 13);
                string approvedKey = Request.Form["tbox_exercise" + recNum];
                int number;
                int.TryParse(approvedKey, out number);
            }
        }
        return View(); // return/redirect to wherever you want
    }
}

Проблема в том, что ваш конечный тег </form> должен стоять в конце вашего представления.

Попробуйте это модифицированное представление:

<form action = "/CreateWorkout/Create" method = "post">
Number of Exercises:
<%= Html.TextBox("tbxNumberOfExercises") %>
<br />
<br />
<input type = "submit" value = "Set Exercise Number" />
<% if (ViewData["number"] != null)%>
There are this many:<%=Html.Encode(ViewData["number"])%>
<br />
and this line should show up
<% if (ViewData["number"] != null)
   {
       int max = (int)ViewData["number"];

       for (int i = 0; i < max; i++)
       {%>
          <br />
          <br />
          <%= Html.TextBox("tbox_exercise" + i) %>
    <% }
   } %>
<% if (ViewData["s"] != null) %>
<%=Html.Encode(ViewData["s"]) %>
</form>

Я бы порекомендовал подход Скотта как лучшую практику. Этот ответ о том, как заставить работать ваш точный сценарий.

Я бы подумал о добавлении текстовых полей на стороне клиента через javascript вместо отправки обратно на сервер для перерисовки формы, предполагая, что вы можете жить с javascript в качестве требования для использования приложения. Если нет, то подход @Scott должен работать. Я бы предпочел, чтобы метод Save принимал параметр FormCollection, а не работал с объектом Request напрямую.

Решение javascript будет иметь одно текстовое поле и кнопку для добавления другого. Пользователь может продолжать добавлять текстовые поля, пока их не будет достаточно.

Спасибо за помощь, ребята! В 5 часов утра я понял, что моя проблема в том, что форма не включает новые текстовые поля / мне нужна другая форма. Мне придется серьезно изучить Javascript и фактически изменить DOM, так как было бы лучше оставить его на стороне клиента.

Спасибо большое.

Другие вопросы по теме