将输入字段绑定到列表

时间:2012-07-20 19:05:09

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

我正在尝试创建一个包含TextAreaFor电子邮件地址的表单。存储在数据库中的电子邮件地址。我希望这些存储的地址是字段的默认值,然后允许用户根据需要在列表中添加或删除地址。

我的viewModel;

public List<string> EmailAddresses { get; set; }

我的观点:

<%= Html.TextAreaFor(m => m.EmailAddresses) %>

(这是错误的,因为它在输入字段中显示System.Collections.Generic.List 1 [System.String]`而不是列表中的每个项目。

我知道我可以遍历列表并为列表中的每个元素显示单独的文本框,但我希望每个元素都列在一个textArea中。 (类似于实际的电子邮件客户端,您可以输入以逗号或半号分隔的多个地址)这可能吗? 我已经搜索过,但是没有找到这种情况,这似乎很奇怪,因为我认为这绝不是不常见的。 我认为解决方案可能是编写自定义editorTemplate,但我希望有一个更简单的解决方案。

2 个答案:

答案 0 :(得分:1)

我会在MVC中使用listboxfor而不是文本区域。这样,您可以在列表中选择单个条目,然后通过单击按钮并重定向到另一个页面或在同一页面上添加要添加的文本框来编辑,删除或添加到该列表。看看这个例子。 http://www.aspnetmvcninja.com/views/asp-net-mvc-select-list-example

此外,如果您想将大量输入到单个测试区域然后添加到列表中,请尝试在“,”上使用TryParse来分隔电子邮件地址。然后将它们添加到列表中。

答案 1 :(得分:1)

您可以像这样扩展您的视图模型。

查看模型     公共类PeopleViewModel {

    public List<string> EmailAddress { get; set; }

    public string EmaiAddressString {
        get {
            string rValue = string.Empty;
            EmailAddress.ForEach(x => rValue += (x + "\n" ));
            return rValue;
        }
        set {
            var newValue = value.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList<string>();
            EmailAddress = newValue;
        }

    }
}

查看

@model SigKoExample.Models.PeopleViewModel
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
@if (IsPost) {
    <h2>New Values</h2>
    @Html.TextArea("EmailAddresses", Model.EmaiAddressString.ToString())
} else {
    using (Html.BeginForm()) { 
        @Html.TextAreaFor(m => m.EmaiAddressString)
        @Html.HiddenFor(m => m.EmailAddress)
        <input type="submit" value="Save" />                               
    }
}

<强>控制器

public ActionResult Index() {
    PeopleViewModel model = new PeopleViewModel {
        EmailAddress = new List<string> {
            "ValueOne",
            "ValueTwo"
        }
    };
    return View(model);
}

[HttpPost]
public ActionResult Index(PeopleViewModel model) {
    return View(model);
}