代码之家  ›  专栏  ›  技术社区  ›  MunkiPhD

在ASP.NET中根据用户输入动态填充表单。Net MVC

  •  0
  • MunkiPhD  · 技术社区  · 16 年前

    我的问题类似于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 回复  |  直到 16 年前
        1
  •  3
  •   Scott    16 年前

    我会分阶段分解,你需要根据需要在某个地方添加一个“保存”视图。

    斯科特

    <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
        }
    }
    
        2
  •  2
  •   tvanfosson    16 年前

    我会考虑通过javascript在客户端添加文本框,而不是发布回服务器以重新绘制表单,假设您可以将javascript作为使用应用程序的要求。如果没有,那么@Scott的方法应该有效。作为首选,我可能会让Save方法接受FormCollection参数,而不是直接处理Request对象。

    javascript的解决方案是有一个文本框和一个按钮来添加另一个。用户可以继续添加文本框,直到有足够的文本框为止。

        3
  •  1
  •   Eric Schoonover thSoft    16 年前

    问题是你的 </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>
    

    我推荐斯科特的方法作为最佳实践。这个答案是关于让你的确切场景发挥作用。

        4
  •  0
  •   MunkiPhD    16 年前

    谢谢你们的帮助。今天早上5点,我意识到我的问题是表单没有包含新的文本框/我需要另一个表单。我必须认真研究Javascript,并实际修改DOM,因为最好将其保留在客户端。

    非常感谢。