一个ViewModel中的多个相同字段。 MVC3

时间:2012-01-06 23:37:41

标签: asp.net-mvc-3 viewmodel

我希望能够通过它的ViewModel为我的联系人添加多个(零个或多个)手机。

我写这个:

public class ContactsViewModel
    {
        public string Skype { get; set; }
        public string Email { get; set; }
        public string Addr { get; set; }
        public IEnumerable<PhoneViewModel> Phones { get; set; }
    }

    public class PhoneViewModel
    {
        public string Number { get; set; }
    }

但是,正如预期的那样,它不起作用。 组织这个的最佳方法是什么?

修改即可。以下是我的观点:

@model RentSite.Web.UI.Models.ContactsViewModel

@{
    ViewBag.Title = "AddContact";
}

<h2>AddContact</h2>
@using (Html.BeginForm())
{
    @Html.EditorForModel(Model)
    @Html.Action("AddPhone")
    <input type="submit" value="Add"/>
}

@model RentSite.Web.UI.Models.PhoneViewModel

@Html.EditorForModel(Model)

这是我的控制器:

public ActionResult Index()
        {
            return View(unitOfWork.contactRepository.All().ToList());
        }

        [Authorize]
        public ActionResult AddContact()
        {
            return this.View();
        }

        [Authorize]
        public ActionResult AddPhone()
        {
           return PartialView();
        }

        [Authorize]
        [HttpPost]
        public ActionResult AddContact(ContactsViewModel contact, IEnumerable<PhoneViewModel> phones)
        {
            contact.Phones = phones;
            return RedirectToAction("AddContact");
        }

1 个答案:

答案 0 :(得分:1)

多个电话号码的呈现将按预期工作。我猜你在发布“发布”多个电话号码的问题。

解决方案取决于您想要实现的目标。以下是两个例子:

解决方案1:用户目前只能发布一个电话号码。渲染所有现有的电话号码,并根据PhoneViewModel创建表单。

解决方案2:用户可以添加多个电话号码并同时发布所有电话号码。你需要一些Javascript。实现客户端功能,允许用户“添加”电话号码字段。使用javascript,唯一地命名每个输入字段(即phone1,phone2,... phonen)。使用相同的模式服务器端从POST数据中获取所有电话号码。

还有更多解决方案。请说明您想要达到的目标。

编辑:解决方案2的示例代码

[HttpPost]
public ActionResult PostPhoneNumbers(FormCollection formCollection)
{
    var phoneNumbers =
        from k in formCollection.AllKeys
        where k.StartsWith("phoneNumber")
        select formCollection[k];

    // validate and process the phone numbers

    return View("your view");
}


enter code here