1

我正在尝试创建一个具有 TextAreaFor 电子邮件地址的表单。有电子邮件地址存储在数据库中。我希望这些存储的地址成为该字段的默认值,然后允许用户在他们认为合适的情况下从列表中添加或删除地址。

我的视图模型;

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

我的观点:

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

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

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

4

2 回答 2

1

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

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

于 2012-07-20T19:17:41.833 回答
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);
}
于 2012-07-20T19:34:56.780 回答