0

私の質問は Engram のhereに似ていますが、私の質問はもう少し進んでいます。私がそれを機能させる方法は、ユーザーがいくつのエントリを作成するかを尋ねるテキストボックスがあることです。彼らが番号を入力した後、入力できるようにさらに多くのテキストボックスを作成する必要があります(そして、それらのテキストボックスで同じプロセスを繰り返しますが、最初は赤ちゃんのステップです...)投稿でキーを収集しようとしましたが、返されるだけですエントリ数を尋ねる最初のテキストボックス。私はまだ 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"]) %>

私が見落としているもの、理解していないものはありますか?それとも、決して理解できないように見えるので、途中でやめるべきですか?

事前に助けてくれてありがとう-私はできる限り学ぼうとしています.

4

4 に答える 4

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
    }
}
于 2008-11-19T04:38:11.413 に答える
2

アプリケーションを使用するための要件としてjavascriptを使用できると仮定して、サーバーにポストバックしてフォームを再描画するのではなく、javascriptを介してクライアント側にテキストボックスを追加することを検討します。そうでない場合は、@Scott のアプローチが機能するはずです。好みの問題として、Request オブジェクトを直接処理するのではなく、Save メソッドが FormCollection パラメーターを受け取るようにすることをお勧めします。

JavaScript の解決策は、1 つのテキスト ボックスと別のテキスト ボックスを追加するためのボタンを用意することです。ユーザーは、十分な数になるまでテキストボックスを追加し続けることができます。

于 2008-11-19T05:20:22.450 に答える
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>

ベストプラクティスとしては、スコットのアプローチをお勧めします。この回答は、正確なシナリオを機能させることに関するものです。

于 2008-11-19T04:42:17.240 に答える
0

助けてくれてありがとう。今朝 5 時に、フォームに新しいテキスト ボックスが含まれていないことが問題であることに気付きました。別のフォームが必要でした。Javascript を真剣に検討し、実際に DOM を変更する必要があります。これは、クライアント側に保持する方がよいためです。

本当にありがとう。

于 2008-11-19T11:03:33.290 に答える