处理某些表单元素以构建对象

时间:2014-02-07 15:06:48

标签: c# asp.net-mvc-3

所有

我有一个表单的一部分,用户可以动态添加元素。他们可以一次添加包含3个输入字段的行。请注意,我没有将这些动态元素绑定到模型 - 我将在HTTP POST处理控制器中处理。

enter image description here

每个添加的行代表一个共同赞助商对象,需要在该对象中创建 表单处理控制器对HTTP POST的操作,然后插入到数据库中。

我想知道命名这些元素的最佳方法是什么,以便我可以在处理控制器中轻松创建对象?

目前,元素的名称如下:

cosponsorcontact_1
cosponsoremail_1
cosponsorphone_1

cosponsorcontact_2
cosponsoremail_2
cosponsorphone_2

cosponsorcontact_4
cosponsoremail_4
cosponsorphone_4

cosponsorcontact_n
cosponsoremail_n
cosponsorphone_n

这将涉及大量的regexing和循环,以将这些重新组合在一起,从而创建对象。我假设这些元素可能以随机顺序存在于Request.Form集合中,并且我们可能没有id的顺序编号,如上例所示。

我当然可以这样做,但我确信必须有一种更简单的方法,也许是在表单元素的命名约定中?

以下是生成的表单内容的片段:

<div id="cosponsors_6" style="display: block;">
    <label>Sponsor club name</label></span>
    <input type="text" title="Co-sponsor contact" placeholder="Name" name="cosponsorcontact_6" id="cosponsorcontact_6">
    <input type="text" title="Co-sponsor email" placeholder="Email" name="cosponsoremail_6" id="cosponsoremail_6">
    <input type="text" title="Co-sponsor phone" placeholder="Phone" name="cosponsorphone_6" id="cosponsorphone_6"><a class="icon delete"></a>
</div>
<div id="cosponsors_7" style="display: block;">
    <label>Sponsor club name</label></span>
    <input type="text" title="Co-sponsor contact" placeholder="Name" name="cosponsorcontact_7" id="cosponsorcontact_7">
    <input type="text" title="Co-sponsor email" placeholder="Email" name="cosponsoremail_7" id="cosponsoremail_7">
    <input type="text" title="Co-sponsor phone" placeholder="Phone" name="cosponsorphone_7" id="cosponsorphone_7"><a class="icon delete"></a><
</div>
<div id="cosponsors_8" style="display: block;">
    <label>Sponsor club name</label></span>
    <input type="text" title="Co-sponsor contact" placeholder="Name" name="cosponsorcontact_8" id="cosponsorcontact_8">
    <input type="text" title="Co-sponsor email" placeholder="Email" name="cosponsoremail_8" id="cosponsoremail_8">
    <input type="text" title="Co-sponsor phone" placeholder="Phone" name="cosponsorphone_8" id="cosponsorphone_8"><a class="icon delete"></a>
</div>
<div id="cosponsors_9" style="display: block;">
    <label>Sponsor club name</label></span>
    <input type="text" title="Co-sponsor contact" placeholder="Name" name="cosponsorcontact_9" id="cosponsorcontact_9">
    <input type="text" title="Co-sponsor email" placeholder="Email" name="cosponsoremail_9" id="cosponsoremail_9">
    <input type="text" title="Co-sponsor phone" placeholder="Phone" name="cosponsorphone_9" id="cosponsorphone_9"><a class="icon delete"></a>
</div>

2 个答案:

答案 0 :(得分:1)

Phil Haack's article on model binding to a list涵盖了回发非连续列表项。

<input type="hidden" name="cosponsorContacts.Index" value="3" />
<input type="text" name="cosponsorContacts[3].contact" value="Whatever" />
<input type="text" name="cosponsorContacts[3].email" value="Here" />
<input type="text" name="cosponsorContacts[3].phone" value="Digits" />

<input type="hidden" name="cosponsorContacts.Index" value="7" />
<input type="text" name="cosponsorContacts[7].contact" value="One" />
<input type="text" name="cosponsorContacts[7].email" value="Two" />
<input type="text" name="cosponsorContacts[7].phone" value="Three/>

答案 1 :(得分:0)

<强>更新...

我的回答不太适合这个问题,但是为了未来的读者,我认为我应该引用这个clean, concise solution,这可以很容易地扩展,以便用AJAX动态添加编辑器模板视图。

原帖......

假设您正在尝试将这些元素绑定到您的操作所期望的某个视图模型中的ICollection属性,那么输入字段的命名约定将如下所示:

id="ViewModelProperty_0__ObjectProperty" name="ViewModelProperty[0].ObjectProperty"
id="ViewModelProperty_1__ObjectProperty" name="ViewModelProperty[1].ObjectProperty"
id="ViewModelProperty_n__ObjectProperty" name="ViewModelProperty[n].ObjectProperty"

换句话说,尝试使用您的示例,如果您的操作看起来像这样:

[HttpPost]
public ActionResult Save(SponsorsEditViewModel postData) { ...

您的课程如下:

public class SponsorViewModel { 
    public String CoSponsorName { get; set; }
    public String CosponserEmail { get; set; }
    ...
}

public class SponsorsEditViewModel {
    public ICollection<SponsorViewModel> Sponsors { get; set; }
    ...
}

然后您的输入字段最终应按如下命名:

<input id="Sponsors_0__CoSponsorName" name="Sponsors[0].CoSponsorName" ...
<input id="Sponsors_0__CoSponsorEmail" name="Sponsors[0].CoSponsorEmail" ...

<input id="Sponsors_1__CoSponsorName" name="Sponsors[1].CoSponsorName" ...
<input id="Sponsors_1__CoSponsorEmail" name="Sponsors[1].CoSponsorEmail" ...

...

<input id="Sponsors_n__CoSponsorName" name="Sponsors[n].CoSponsorName" ...
<input id="Sponsors_n__CoSponsorEmail" name="Sponsors[n].CoSponsorEmail" ...

请注意,我们使用的是ICollection而不是IEnumerable,因为IEnumerable是只读的。绑定会失败。

另外,我似乎记得如果序列被破坏(即跳过一个数字),那么跳过之后的任何东西都不会被绑定。

当然,MVC3可以为您自动生成所有这些,但在这种情况下,您将动态生成这些新字段。

作为旁注,如果您不熟悉它们,请查看editor templates

希望这有帮助。

未来读者的附录...请注意,我的解决方案不会解决非顺序编号的处理问题。