MVC EditorFor绑定到数组中的类型

时间:2011-11-25 01:42:40

标签: asp.net-mvc-3 binding viewmodel

我有一个ViewModel,除其他属性外,还包含一个'EmailAddress'对象数组。 EmailAddress本身具有“地址”和“IsPrimary”等属性。我的观点模型细分是:

public class UserDetailsViewModel {
  public BUser User { get; set; }
  public string[] Roles { get; set; }
  public EmailAddress[] EmailAddresses { get; set; }
}

我正在显示非常标准的“用户详细信息”页面。例如,我使用@Html.DisplayFor(model => model.User.UserName)@Html.DisplayFor(model => model.User.Comment)显示数据我在页面上还有一个部分列出了与用户关联的所有EmailAddress对象:

@if(Model.EmailAddresses.Length > 0) {
  foreach (var address in Model.EmailAddresses) {
    <div>
      @Html.DisplayFor(model => address.Address)
    </div>
  }
} else {
  <div class="center">User does not have any email addresses.</div>
}

我的问题是我想在电子邮件地址列表上方显示“添加电子邮件地址”表单。我想我会采取“正常”的做法:

@using(Html.BeginForm(new { id=Model.User.UserName, action="AddUserEmailAddress" })) {    
  <text>Address:</text> @Html.EditorFor(model => ** HERE I AM STUCK **)
  <input type="submit" value="Add Email" class="button" />
}

你可能会说,我被困在这里。我试过了model => Model.EmailAddresses[0]model => Model.EmailAddresses.FirstOrDefault()。这两个都失败了。

我确信我这一切都错了。我甚至想过为我的ViewAddress类型的EmailMode添加一个“虚拟”属性,这样我就可以在我的EditorFor中绑定它 - 但这似乎是一个非常糟糕的黑客。我必须要有一些简单的东西!

我很感激任何人都可以提供任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:1)

你可以采用快速和肮脏的方式使用:

@Html.TextBox("NewEmail")

在AddUserEmailAddress控制器方法中,您可以使用以下方法获取发布的值:

Request.Form.GetValues("NewEmail")

Request["NewEmail"]

如果您不想放弃内置验证,如您所述,您始终可以在ViewModel中创建另一个属性? 使用表单提供视图,或使用jQuery.load(“/ Controller / AddEmail / UserID”)动态加载它。添加

public string NewEmail { get; set; } 
您的ViewModel中的

以及视图中的下方

@Html.EditorFor(model=>model.NewEmail)

另外,您可以考虑对List等电子邮件使用强类型结构,以便在特定情况下更好地控制数据。

答案 1 :(得分:1)

我对MVC很陌生,但我已经解决了这个问题,我使用了@Html.Partial

@Html.Partial("path/to/EditorTemplate", new EmailAddress())

我也尝试采用EmailAddresses[0]路线,我记得那天深情。 我也不是肯定的,这是最好的方式,但它与我的其他代码很好地配合。