我有一个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中绑定它 - 但这似乎是一个非常糟糕的黑客。我必须要有一些简单的东西!
我很感激任何人都可以提供任何帮助。提前谢谢!
答案 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]
路线,我记得那天深情。
我也不是肯定的,这是最好的方式,但它与我的其他代码很好地配合。