在asp.net中,您可以使用asp:Repeater动态生成控件。
例如:
<asp:Repeater runat="server" id="rpt">
<ItemTemplate>
<asp:Textbox runat="server"/>
</ItemTemplate>
</asp:Repeater>
然后你可以遍历服务器端的项目:
foreach(var items in rpt.Items)
{
}
在MVC中,你可以这样做:
@foreach(var item in model)
{
@Html.TextBoxFor(a=>item.searchCriteria);
}
但是有一个问题:
我想在用户点击添加更多文本框按钮时生成文本框:
如果我在MVC中使用foreach,那么我将无法在控制器上获取用户输入,而且,我没有要循环的模型。
最终所需的输出将是:
用户点击“添加更多文本框”按钮后,新文本框将附加到底部,在用户单击搜索按钮后,文本框内的文本将生成为查询字符串,如下所示:
查看:
<input name="searchCriteria" type="text" class="form-control" />
<input name="searchCriteria" type="text" class="form-control" />
<input name="searchCriteria" type="text" class="form-control" />
<input name="searchCriteria" type="text" class="form-control" />
控制器:
public ActionResult Search()
{
string queryString = Request.RawUrl;
//parse the querystring here
return View(NumberOfVisitorsReport);
}
生成的查询字符串为:
www.website.com/?searchCriteria=a&searchCriteria=b&searchCriteria=c
那么有什么替代方法可以在MVC中实现这一目标吗?
编辑:
我看过一些关于“如何在MVC中动态生成控件”的帖子
例如
Control creation based on model value in MVC4
他正在根据数据库中的值生成控件,如果我将其实现到我的网站,控件将在每个帖子上失去价值。
答案 0 :(得分:1)
您可能希望摆脱“回发”,并期望使用jQuery或类似框架在浏览器中动态添加文本框。如果您仔细命名新文本框或将提交作为JSON对象的AJAX帖子进行,则可以从所有添加的控件中获取所有值。
答案 1 :(得分:1)
答案 2 :(得分:0)
您将不得不使用ForEach的 For loop insead。然后使用索引来创建新的文本框控件,这样当您提交表单时,新创建的文本框的索引将被提交,如果模型的数据类型是,则甚至可以将其绑定到模型的列表强>
示例:
@for (int i = 0; i < Model.Contributor.Count(); i++)
{
@Html.HiddenFor(model => Model.Contributor[i].Id)
}
现在您知道“i”的值/索引,使用它来填充新控件。