【问题标题】:MVC EditorFor bind to type in arrayMVC EditorFor 绑定到数组类型
【发布时间】:2011-11-25 01:42:40
【问题描述】:

我有一个 ViewModel,除其他属性外,它还包含一个“EmailAddress”对象数组。 EmailAddress 本身具有“Address”和“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 =&gt; Model.EmailAddresses[0]model =&gt; Model.EmailAddresses.FirstOrDefault()。这两个都失败了。

我确信我做错了。我什至想过在我的 ViewModel 类型的 EmailAddress 中添加一个“虚拟”属性,以便我可以在我的 EditorFor 中绑定到它——但这似乎是一个非常糟糕的 hack。必须有一些简单的东西我忽略了!

如果有人能就此事提供任何帮助,我将不胜感激。提前谢谢!

【问题讨论】:

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


    【解决方案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)
    

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

    【讨论】:

    • 我想到了,但后来我没有得到自动模型验证(客户端和服务器端)。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多