动态增长的文本字段

时间:2011-01-25 00:50:14

标签: c# asp.net-mvc

在asp.net mvc2(c#)中处理以下情况的最佳方法是什么:

我有一个表单,用户可以在其中添加更多字段...例如,我向用户询问他们拥有的个人计算设备的详细信息。为了简单起见,我想说我要求品牌和类型(桌面/笔记本电脑/平板电脑/其他的下拉列表),他们可以提供无限的设备。我将从一对文本框开始:

<label>Type</label>
<select><option>Desktop</option><option>Laptop</option><option>Tablet</option><option>Other</option></select>
<label>Brand</label>
<input type="text" />
<input type="button" value="Add more device" />

然后当用户点击“添加更多设备”按钮时,我将显示另一对品牌和类型文本框......依此类推。

我的问题是我应该如何使用HTML帮助器,如何构建viewModel等。

我来自PHP背景,我曾经在PHP中使用以下内容:

<input type="text" name="brand[]" />

后端会给我一系列品牌......不确定这是否可以在asp.net环境中使用。我很感激任何意见。谢谢。

[我添加了以下几行以使我的问题更清晰] 我想我的问题并不是很清楚。

假设我有以下viewmodel:

public class UserRegisterViewModel
{
    public string DeviceBrand { get; set; }
    public string DeviceType { get; set; }
}

当我有两个文本框时,这很有效:

<%: Html.TextBoxFor(m => m.DeviceBrand) %>
<%: Html.TextBoxFor(m => m.DeviceType) %>

但我面临的情况是我需要允许用户添加更多设备品牌和文本框...用户应该能够添加他需要的数量。

我应该如何编写视图模型和视图?

我希望这会让我的问题更加清晰。我在隐藏和显示文本框方面没有问题(是的,我使用JQuery)。

谢谢。

4 个答案:

答案 0 :(得分:1)

在C#中,C ++数组就像固定大小一样。但是,您可以使用List&lt;&gt;做类似的事情。它允许您使用添加功能动态添加数据。像这样:

List<object> name = new List<object>();
name.Add(an_object);

所以说一个字符串列表:

List<string> myStrings == new List<string>();
myStrings.Add("Blah");

它们就像数组一样被访问 - Console.WriteLine(myStrings [0])输出Blah

答案 1 :(得分:0)

根据情况,有以下解决方案:

  • 如果您已经知道将显示哪些文本框,请将它们添加到您的页面中并将其可见性设置为false(如CSS中的“display:none”)并稍后再显示它们。

  • 如果您事先不知道将显示哪些文本框,您仍然可以将它们附加到HTML DOm中(将其添加到您页面的控件集合中)

要向他们展示有两个apporaches:

  • 在第一种情况下,可以使用jQuery或Javascript来显示它们。
  • 在第一种情况下,使用也可以从服务器端执行,这将导致整页回发。

  • 在第二个Apporach中您还可以使用jQuery或Javascript在表单中添加新的文本框

  • 在第二种情况下,您可以在服务器上添加C#代码中的新框,但同样会导致整页回发。

使用最适合您的方法

答案 2 :(得分:0)

您可以做的是将UserRegister作为Model并拥有UserRegisterViewModel 列表属性

然后在您的视图中,您可以使用循环来呈现您的viewmodel列表属性

在例如C#

中的foreach中

答案 3 :(得分:0)

假设您将ViewModel定义为:

 public class BrandListViewModel
 {
      public List<UserRegisterViewModel> Brands {get;set;}
 }

您的视图需要输出HTML格式:

 <select name="Brands[0].DeviceType">...</select>
 <input type="text" name="Brands[0].DeviceBrand"/>

 <select name="Brands[1].DeviceType">...</select>
 <input type="text" name="Brands[1].DeviceBrand"/>

您需要保持索引的运行,以便模型绑定器可以按正确的顺序构建列表。现在,您可以使用jQuery来执行此操作,并且当您将项目附加到页面时,只需获取计数并按1递增。如果要删除单个字段,则需要重命名所有字段。

您还可以使用纯jQuery方法,解析元素,将项目推送到数组并将数组发送到服务器。