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的想法。