从多个文本框中提取用户输入,并将其作为列表传递回控制器
本文关键字:列表 控制器 文本 输入 用户 提取 | 更新日期: 2023-09-27 18:01:14
我有一个由多个局部视图组成的视图,每个局部视图都为最终存储在多个表中的数据创建用户输入字段:每个局部视图一个。
我可以很好地将单行数据写回数据库。下面,.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并不能自动将它们加载到电话表类型列表中。
有什么想法吗?
在控制器中,您可以访问Request.Params
对象中的Phone1
、Phone2
等。Request.Params
是所有字段(查询字符串、表单字段、服务器变量、cookie等(的组合。
如果您希望字段从视图自动映射到控制器方法(即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());
HTTP的工作原理与此相同。它对列表或C#一无所知。您必须将参数绑定到服务器端的列表中。