我应该如何在MVC 5中序列化动态表单元素?

时间:2014-04-09 21:25:45

标签: c# jquery asp.net-mvc forms asp.net-mvc-5

我有一个MVC 5项目,其中一部分是注册。目前,表格使用标准表格提交动作提交,我的模型活页夹完美地完成了它的工作,一切都很好。

但是,我现在需要在表单中添加动态元素,以便用户需要能够添加动态邀请,通过文本框添加团队成员的电子邮件地址和该团队成员角色的下拉列表...以及添加另一个按钮,为下一个团队成员添加另一个文本框和下拉列表...以及下一个...无限广告......

在提交表单后,我的模型绑定器将会崩溃并且不知道如何处理这些动态元素,所以我需要有关如何让我的模型绑定器将这些项目反序列化为电子邮件和数组的建议。角色(角色绑定到枚举)。

我已经建议客户端脚本可以捕获提交并将项目序列化为文本字符串并将其放入隐藏的表单字段中,然后我可以在我的控制器操作上手动反序列化,这看起来像& #39;工作正常,但感觉很脏。

实现这一目标最直接的方法是什么?如果我正确配置我的视图,.NET内置了什么会自动处理这个问题吗?

3 个答案:

答案 0 :(得分:0)

您的模型可以将您的“动态”字段存储在以下集合中:

public List<string> Emails { get; set; }

在您的视图中,您只需创建后续索引名称(确切命名取决于您如何生成此新字段):

model.Emails[0] // name="Emails[0]"
model.Emails[1] // name="Emails[1]"

在你的控制器动作中,模型绑定器不应该有任何特殊之处。它将很容易处理集合。

答案 1 :(得分:0)

Phil Haack有一篇关于绑定到List的旧文章:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

我猜您可以在模型中添加ICollection&lt; Invitation&gt; -Property,并按照文章中的说明设置表单字段的名称。

虽然我个人将数据绑定到JavaScript-ViewModel并使用Ajax将JSON发回服务器。

答案 2 :(得分:0)

单击“添加更多”按钮后,只需注入文本框和下拉列表,然后像往常一样将表单序列化。

在服务器上,接受invitations

的列表
public class Invitation
{
   public string EmailAddresss {get; set;}
   public int InvitationType {get; set; }
}


public ActionResult Register(MyCurrentModel dto, Invitation[] invitations)
{
   //..
}