我有一个由多个局部视图组成的视图,每个局部视图都为数据创建用户输入字段,最终将存储在多个表中:每个部分视图一个。
我可以将单行数据写回数据库就好了。下面,.Add(primary)工作正常,因为主表总是只有一个名字和名字。
但是,有时给定的回发有多个电话号码。我需要将每个加载到电话表列表中,然后在Create方法中将它们拉回来,对吗?这是我的控制器的当前Create方法。
public ActionResult Create(PrimaryTable newprimary, List<PhoneTable> newphone)
{
if (ModelState.IsValid)
{
db.PrimaryTables.Add(newprimary);
foreach (var phone in newphone)
{
phone.CareGiverID = newCareGiverID;
db.tblPhones.Add(phone);
db.tblPhones.Last().CareGiverID = newCareGiverID;
}
db.SaveChanges();
return RedirectToAction("Index");
}
我当前的手机部分视图。
@model IList<FFCNMaintenance.Models.PhoneTable>
<div>
<label class="label-fixed-width">Phone:</label>
@Html.TextBox("Phone1", null, new { style = "width: 600px" })
<br />
<label class="label-fixed-width">Phone:</label>
@Html.TextBox("Phone2", null, new { style = "width: 600px" })
<br />
</div>
但是,很明显,只需将它们命名为Phone1和Phone2,就不会自动将它们加载到电话表类型列表中。
有什么想法吗?
答案 0 :(得分:0)
HTTP可以正常工作。它对列表或C#一无所知。您必须将参数绑定到服务器端的列表中。
答案 1 :(得分:0)
在您的控制器中,您可以访问Phone1
对象中的Phone2
,Request.Params
等。 Request.Params
是所有字段的组合(查询字符串,表单字段,服务器变量,cookie等)。
如果您希望字段自动从View映射到控制器方法中的参数(即List<PhoneTable>
),您可以实现自己的客户ModelBinder
。
这是一个快速(未经测试)的示例,可让您了解自定义模型绑定器的工作原理。
public class PhoneModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// If not the type that this binder wants, return null.
if (!typeof(List<PhoneTable>).IsAssignableFrom(bindingContext.ModelType))
{
return null;
}
var phoneTable = new List<PhoneTable>();
int i = 1;
while (true)
{
var phoneField = bindingContext.ValueProvider.GetValue("Phone" + i.ToString());
if (phoneField != null)
{
phoneTable.Add(new PhoneTable() { Number = phoneField.AttemptedValue });
i++;
continue;
}
break;
}
return phoneTable;
}
}
要注册此活页夹,您需要将其添加到模型活页夹集合中,或使用自定义模型活页夹提供程序来确定要使用的模型活页夹。以下是如何将其简单地添加到模型绑定器的集合中。
ModelBinders.Binders.Add(typeof(List<PhoneTable>), new PhoneModelBinder());