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

本文关键字:列表 控制器 文本 输入 用户 提取 | 更新日期: 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对象中的Phone1Phone2等。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#一无所知。您必须将参数绑定到服务器端的列表中。