Мой вопрос похож на здесь Энграма, но мой вопрос идет немного дальше. Я предполагаю, что у меня есть текстовое поле с вопросом, сколько записей собирается сделать пользователь. После того, как они введут номер, мне нужно создать еще столько текстовых полей, чтобы разрешить записи (а затем повторить тот же процесс с этими текстовыми полями, но сначала детские шаги ...) Я попытался собрать ключи в сообщении, но он только возвращает начальное текстовое поле с запросом количества записей. Я все еще пытаюсь разобраться в 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"]) %>
Есть ли что-то, что я не замечаю, не понимаю, или мне стоит бросить курить, пока я занимаюсь этим, потому что мне кажется, что я никогда этого не пойму?
Заранее благодарим за любую помощь - я просто пытаюсь узнать как можно больше.





Я бы разбил это на этапы, вам нужно будет добавить представление «Сохранить» где-нибудь в зависимости от того, что вы хотите.
Скотт
<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, так как было бы лучше оставить его на стороне клиента.
Спасибо большое.