C# 从多个文本框中提取用户输入,并作为列表传递回控制器
我有一个由多个局部视图组成的视图,每个局部视图为最终将存储在多个表中的数据创建用户输入字段:每个局部视图一个C# 从多个文本框中提取用户输入,并作为列表传递回控制器,c#,asp.net-mvc,entity-framework-6,C#,Asp.net Mvc,Entity Framework 6,我有一个由多个局部视图组成的视图,每个局部视图为最终将存储在多个表中的数据创建用户输入字段:每个局部视图一个 @model IList<FFCNMaintenance.Models.PhoneTable> <div> <label class="label-fixed-width">Phone:</label> @Html.TextBox("Phone1", null, new { style = "width: 600px" }) <
@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>
我可以将单行数据写回数据库。下面,.Add(primary)工作正常,因为主表始终只有一个名字和姓氏
但是,有时一次回传会有多个电话号码。我需要将它们加载到一个电话表列表中,然后在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");
}
public ActionResult创建(PrimaryTable newprimary,List newphone)
{
if(ModelState.IsValid)
{
db.PrimaryTables.Add(newprimary);
foreach(新电话中的var电话)
{
phone.careerId=新的医务人员ID;
db.tblPhones.Add(电话);
db.tblPhones.Last();
}
db.SaveChanges();
返回操作(“索引”);
}
和我当前的手机部分视图
@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>
@model-IList
电话:
@TextBox(“Phone1”,null,新的{style=“width:600px”})
电话:
@TextBox(“Phone2”,空,新{style=“width:600px”})
但是,很明显,简单地将它们命名为Phone1和Phone2并不会自动将它们加载到电话表类型列表中
有什么想法吗?HTTP的工作原理是这样的。它对列表或C#一无所知。您必须将参数绑定到服务器端的列表。在控制器中,您可以访问
请求对象中的电话1
,电话2
等。请求。参数是所有字段的组合(查询字符串、表单字段、服务器变量、cookie等)
如果您希望字段自动从视图映射到控制器方法(即列表
)中的参数,您可以实现自己的客户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;
}
}
公共类PhoneModelBinder:IModelBinder
{
公共对象绑定模型(ControllerContext ControllerContext,ModelBindingContext bindingContext)
{
//如果不是此绑定器所需的类型,则返回null。
如果(!typeof(List).IsAssignableFrom(bindingContext.ModelType))
{
返回null;
}
var phoneTable=新列表();
int i=1;
while(true)
{
var phoneField=bindingContext.ValueProvider.GetValue(“Phone”+i.ToString());
if(phoneField!=null)
{
添加(新的phoneTable(){Number=phoneField.AttemptedValue});
i++;
继续;
}
打破
}
返回电话表;
}
}
要注册此活页夹,您需要将其添加到模型活页夹集合中,或使用自定义模型活页夹提供程序确定要使用的模型活页夹。以下是如何将其添加到模型活页夹集合中
ModelBinders.Binders.Add(typeof(List<PhoneTable>), new PhoneModelBinder());
ModelBinders.Binders.Add(typeof(List),newphonemodelbinder());
some。今天晚些时候将实施并测试。谢谢@PeteGO的想法。