2008-11-19 6 views
0

Мой вопрос похож на Engram's here, но мой вопрос идет немного дальше. Способ, которым я намереваюсь работать, - это текстовое поле с вопросом, сколько записей пользователь сделает. После ввода номера мне нужно создать еще много текстовых полей, чтобы разрешить записи (а затем повторить один и тот же процесс с этими текстовыми полями, но сначала шаги для ребенка ...) Я попытался собрать ключи в сообщении, но он возвращает только в начальном текстовом поле запрашивается количество записей. Я все еще пытаюсь понять MVC, а уроки/видео до сих пор не углублялись в это. Опять же, я знаю, что это, вероятно, то, что я мог бы использовать с помощью JQuery, но я все равно буду придерживаться той же ситуации.Заполнение формы динамически на основе пользовательского ввода в ASP.Net MVC

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

[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"]) %> 

Есть ли что-то я с видом, не понимая, или я должен уйти, пока я «У меня это получается, потому что кажется, что я никогда не получу его?

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

ответ

3

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

Скотт

<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 
    } 
} 
1

Проблема заключается в том, что ваш </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> 

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

2

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

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

0

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

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

Смежные вопросы