【问题标题】:Filling out a model from a FormCollection从 FormCollection 中填写模型
【发布时间】:2015-07-11 01:24:34
【问题描述】:

我想用 FormCollection 中的数据填充我的模型。

我传递给我的页面的视图模型有一个属性,即汽车列表。

public List<Car> Cars { get; set; }

在视图中,我循环遍历每个并作为表单输出

@for (int i = 0; i < Model.Cars.Count; i++)
    {
        <form action="#" id="updateForm-@Model.Cars[i].Id" class="updateForm">
            @Html.AntiForgeryToken()
            @Html.Hidden("Id", Model.Cars[i].Id)
            <div class="row">
                <div class="col-md-2 col-sm-4">
                    @Html.TextBoxFor(m => m.Cars[i].CarName, new { placeholder = "car name", name = "CarName", id = "CarName", @class = "user-friendly-size" })
                </div>

等等。每个表单都有自己的按钮。

然后我使用 JQuery 来 form.serialise 并将表单数据发送到后端

[AjaxOnly]
    public JsonResult Update(FormCollection form)

据我了解,我无法使用模型绑定器,即

    public JsonResult Update(Car car)

因为当表单数据被序列化并发布时,名称通过 Cars[0].Id,并且模型绑定器无法绑定。这是我的理解。

有没有办法以一种非常简单的方式将 FormCollection 中的值提取到我的模型中?可能使用反射?还是我错了,我们可以自动绑定?

【问题讨论】:

    标签: asp.net-mvc model-binding


    【解决方案1】:

    使用 foreach 循环并使用您的汽车模型的属性。然后你的模型应该在发布到更新操作时绑定:

    @foreach (var car in Model.Cars)
        {
            <form action="#" id="updateForm-@Model.Id" class="updateForm">
                @Html.AntiForgeryToken()
                @Html.Hidden("Id", car.Id)
    

    【讨论】:

    • 我删除了我的答案,因为我没有注意到 OP 为每辆车创建了一个新表格。在这种情况下,这是正确的答案
    • 我说你不​​能在这里使用 TextBoxFor() 并且必须使用 TextBox(car.CarName, car.CarName, new { ... }) 是否正确?因为 TextBoxFor() 需要一个 lambda 表达式。
    【解决方案2】:

    如果您一次只发送一个 Car 实例,您真的不需要包含迭代器来呈现表单输入名称,因为每个表单只是在其自己的范围内发送输入。

    那么您只需要收到一个汽车模型,就像您在原始问题中所说的那样:

    public JsonResult Update(Car car) 
    

    您只需要确保覆盖助手提供的默认 id 和名称,就像您对 CarName 输入所做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2011-08-27
      • 2017-01-14
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多