如何在MVC中动态生成控件?

时间:2016-01-24 04:43:27

标签: c# asp.net asp.net-mvc asp.net-mvc-4

在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);
}

但是有一个问题:

我想在用户点击添加更多文本框按钮时生成文本框:

enter image description here

如果我在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

他正在根据数据库中的值生成控件,如果我将其实现到我的网站,控件将在每个帖子上失去价值。

3 个答案:

答案 0 :(得分:1)

您可能希望摆脱“回发”,并期望使用jQuery或类似框架在浏览器中动态添加文本框。如果您仔细命名新文本框或将提交作为JSON对象的AJAX帖子进行,则可以从所有添加的控件中获取所有值。

答案 1 :(得分:1)

你必须使用jquery。

本文可以帮助解决问题。

Dynamic Form in Asp.net MVC & jquery

答案 2 :(得分:0)

您将不得不使用ForEach的 For loop insead。然后使用索引来创建新的文本框控件,这样当您提交表单时,新创建的文本框的索引将被提交,如果模型的数据类型是,则甚至可以将其绑定到模型的列表

示例:

 @for (int i = 0; i < Model.Contributor.Count(); i++)
    {

        @Html.HiddenFor(model => Model.Contributor[i].Id)

  }

现在您知道“i”的值/索引,使用它来填充新控件。