我有一个客户需要能够创建候选人。考生可以具有多种资格(资格证书是4个属性的模型)。客户需要能够在创建页面上向员工添加N个资格。
查看模型
public class CreateCandidateViewModel
{
[DisplayName("First Name"), Required]
public string FirstName { get; set; }
[DisplayName("Last Name"), Required]
public string LastName { get; set; }
[DisplayName("Email Address"), Required]
public string Email { get; set; }
[DisplayName("Phone Number"), Required]
public string Phone { get; set; }
[DisplayName("Zip Code"), Required]
public int ZipCode { get; set; }
public List<Qualification> Qualifications { get; set; }
}
资格模型
public class Qualification
{
[Key]
public int Id { get; set; }
public int QualificationTypeId { get; set; }
public string Name { get; set; }
public DateTime DateStarted { get; set; }
public DateTime DateCompleted { get; set; }
[ForeignKey("QualificationTypeId")]
public virtual QualificationType Type { get; set; }
}
我不知道如何解决这个问题。我想先创建候选人,然后将客户端发送到另一个视图,客户端可以在其中添加资格等等。
答案 0 :(得分:3)
我假设您的帖子控制器期待CreateCandidateViewModel
当模型具有对象列表的属性时,可以进行模型绑定,只要在提交表单时输入的命名正确即可。关键是索引输入上的名称:
<input type="text" name="Qualifications[0].Id" />
<input type="text" name="Qualifications[0].QualificationTypeId" />
<input type="text" name="Qualifications[0].Name" />
<input type="text" name="Qualifications[0].DateStarted" />
<input type="text" name="Qualifications[0].DateCompleted" />
<input type="text" name="Qualifications[1].Id" />
<input type="text" name="Qualifications[1].QualificationTypeId" />
<input type="text" name="Qualifications[1].Name" />
<input type="text" name="Qualifications[1].DateStarted" />
<input type="text" name="Qualifications[1].DateCompleted" />
这将在提交时正确绑定到您的模型。删除&#34;资格&#34;时要注意重置索引。添加之后,或者您可能会在列表中找到空对象或丢失对象。我之前使用JQuery和正则表达式成功完成了这项工作。
如果你想采用Ajax方式,你可以创建一个局部视图并使用AJAX调用它。
public ActionResult QualificationsPartial(Int32 Index)
{
return PartialView(model:Index);
}
@model Int32
<input type="text" name="Qualifications[@Model.ToString()].Id" />
<input type="text" name="Qualifications[@Model.ToString()].QualificationTypeId" />
<input type="text" name="Qualifications[@Model.ToString()].Name" />
<input type="text" name="Qualifications[@Model.ToString()].DateStarted" />
<input type="text" name="Qualifications[@Model.ToString()].DateCompleted" />
var QualificationIndex = parseInt(1); // 1 because we already have 0 loaded
$("#AddQualificationElement").click(function () {
$.ajax({
cache: false,
type: "GET",
url: "/MyController/QualificationsPartial",
data: {
Index: QualificationIndex
},
success: function (data) {
// data will be the html from the partial view
$("#QualificationsContainer").append(data);
},
error: function (xhr, ajaxOptions, thrownError) {
// Handle the error somehow
}
}); // end ajax call
}); // end AddQualificationElement click event