从多个文本框中提取用户输入并将列表作为列表传递回控制器

时间:2015-07-04 22:05:46

标签: c# asp.net-mvc entity-framework-6

我有一个由多个局部视图组成的视图,每个局部视图都为数据创建用户输入字段,最终将存储在多个表中:每个部分视图一个。

我可以将单行数据写回数据库就好了。下面,.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,就不会自动将它们加载到电话表类型列表中。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

HTTP可以正常工作。它对列表或C#一无所知。您必须将参数绑定到服务器端的列表中。

答案 1 :(得分:0)

在您的控制器中,您可以访问Phone1对象中的Phone2Request.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());