我的问题类似于英格兰的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"]) %>
我有什么东西可以忽视,不理解,还是我应该放弃,因为看起来我永远不会得到它?
提前感谢您的帮助 - 我只是尽力学习。
答案 0 :(得分: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 :(得分:2)
我会考虑通过javascript添加文本框客户端,而不是回发到服务器以重新绘制表单,假设您可以使用javascript作为使用该应用程序的要求。如果没有,那么@Scott的方法应该有效。作为优先选择,我可能会使用Save方法获取FormCollection参数,而不是直接处理Request对象。
javascript解决方案是使用单个文本框和按钮来添加另一个文本框。用户可以继续添加文本框,直到他们有足够的文本框。
答案 2 :(得分: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>
就最佳做法而言,我会推荐斯科特的方法。这个答案是关于让您的确切方案有效。
答案 3 :(得分:0)
感谢帮助人员。我在今天早上5点意识到我的问题是表单没有包含新的文本框/我需要另一个表单。我将不得不认真研究Javascript并实际修改DOM,因为最好保持它的客户端。
非常感谢。