如何将List <x>绑定到ViewModel </x>

时间:2013-12-06 15:40:38

标签: asp.net-mvc asp.net-mvc-4 razor

我有2个ViewModels - User和Reminder。

public class UserViewModel
{        
    [Required]
    [Display(Name = "Your name")]
    public string Name { get; set; }


    [Display(Name = "Your reminders")]
    public IEnumerable<ReminderViewModel> Reminders { get; set; }
}

public class ReminderViewModel
{
    [Required]
    [Display(Name = "Time")]
    public TimeSpan Time { get; set; }


    [Required]
    [Display(Name = "Frequency of repair")]
    public string Frequency { get; set; }
}

我的添加视图:

@using (Html.BeginForm("Add", "Test"))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @ViewBag.Status

            <ul style="list-style: none;">
                <li>
                    @Html.LabelFor(m => m.Name)
                    @Html.TextBoxFor(m => m.Name)
                    @Html.ValidationMessageFor(m => m.Name)
                </li>

                   ???????????? // Reminders
                <li>
                    <input type="submit" value="Add" /></li>
            </ul>

}

我的问题是:如何在我的视图中绑定此IEnumerable<ReminderViewModel>

我希望实现这样的情况,用户可以在发送点击之前多次提交一些提醒(选择时间和频率)。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

首先,您需要将其更改为List<ReminderViewModel>。为了获得正确的模型绑定,您必须能够使用索引值选择对象。

然后在你看来:

@for (var i = 0; i < Model.Reminders.Count(); i++)
{
    @Html.LabelFor(m => m.Reminders[i].Time)
    @Html.TextBoxFor(m => m.Reminders[i].Time)
    @Html.ValidationMessageFor(m => m.Reminders[i].Time)

    @Html.LabelFor(m => m.Reminders[i].Frequency)
    @Html.TextBoxFor(m => m.Reminders[i].Frequency)
    @Html.ValidationMessageFor(m => m.Reminders[i].Frequency)
}

如果Reminders最初为空,则您需要在操作中使用一个或多个ReminderViewModels对其进行初始化:

var model = new UserViewModel {
    Reminders = new List<ReminderViewModel> {
        new ReminderViewModel()
    }
}
return View(model);

或者您可以在UserViewModel的构造函数中执行此操作:

public class UserViewModel
{
    public UserViewModel()
    {
        Reminders = new List<ReminderViewModel> {
            new ReminderViewModel();
        }
    }
}

答案 1 :(得分:0)

您需要执行以下操作:

首先在视图顶部添加对模型的引用,如下所示:

 @model UserViewModel

包括您的命名空间。

将您的集合更改为用户列表,以便可以将其编入索引并将模型绑定为:

         @for (var i = 0; i < Model.Reminders.Count(); i++)
         {
            @Html.LabelFor(m => Model.Reminders[i].Frequency)
            @Html.TextBoxFor(m => Model.Reminders[i].Frequency)
            @Html.ValidationMessageFor(m => Model.Reminders[i].Frequency)
            @Html.LabelFor(m => Model.Reminders[i].Time)
            @Html.TextBoxFor(m => Model.Reminders[i].Time)
            @Html.ValidationMessageFor(m => Model.Reminders[i].Time)
         }

这在您的模型中:

 [Display(Name = "Your reminders")]
 public List<ReminderViewModel> Reminders { get; set; }

您还需要更改“开始”表单,将其设置为发布如下:

@using (Html.BeginForm("Add", "Test", FormMethod.Post))

最后,您需要实现这样的帖子,将模型作为参数:

[HttpPost]
public ActionResult Add(UserViewModel model)
{
    // Do processing here
    return View(model);
}