2011-11-25 61 views
2

我有一个视图模型的是,其他特性中,包含“EmailAddress的”对象的数组。 EmailAddress本身具有诸如“地址”和“IsPrimary”之类的属性。我的查看模型细分为:MVC EditorFor结合键入阵列

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()。这两个都失败了。

我相信,我会对此完全错误的。我甚至想过为我的EmailAddress类型的ViewModel添加一个“虚拟”属性,这样我就可以绑定到我的EditorFor中 - 但这似乎是一个非常糟糕的黑客攻击。必须有一些简单的东西,我可以忽略!

我希望得到任何帮助任何人都可以用这件事提供。先谢谢你!

回答

1

你可以去使用的快速&肮脏的方式:

@Html.TextBox("NewEmail") 

在你AddUserEmailAddress控制器的方法,你将能够使用以获得贴值:

Request.Form.GetValues("NewEmail") 

Request["NewEmail"] 

如果你不想失去内置的验证,正如你所说的,你总是可以在ViewModel中创建另一个属性? 供应您与窗体视图,或者与jQuery.load(“/控制器/ AddEmail /用户ID”)动态加载。添加

public string NewEmail { get; set; } 
在你的ViewModel

,并在下方在您的视图

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

此外,您可以考虑使用强类型结构为你的电子邮件像列表,让你更好地控制在特定情况下您的数据。

+0

我想到了,但后来我没有得到自动模型验证(客户端和服务器端)。 – BradBrening

1

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

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

我也试图走EmailAddresses[0]条路,我记得那一天深情。 我也不是积极的,这是最好的方式,但它与我的其他代码很好地发挥。