模型不从视图收集值到 HttpPost 控制器方法

Models not collecting values from View to HttpPost Controller Method

我目前正在尝试将模型列表从我的视图传递到我的控制器。目前,我能够从视图中获取每个模型并将它们放在一个列表中,然后在 HttpPost 控制器 ActionResult 方法中传递该列表。但是,在执行此操作时,none 个模型中包含它们的数据,因为所有模型的 属性 值都设置为 0 或 null。 我的代码如下:

查看:

@using (Html.BeginForm("SaveCarouselImageData", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
            {
                <div class="card shadow">
                    <div class="card-header border-0">
                        <div class="row align-items-center">
                            <div class="col">
                                <h3 class="mb-0">Homepage Carousel</h3>
                            </div>
                        </div>
                    </div>
                    <div class="table-responsive">
                        <table class="table align-items-center table-flush">
                            <thead class="thead-light">
                                <tr>
                                    <th></th>
                                    <th scope="col">Image</th>
                                    <th scope="col">Order Num</th>
                                    <th></th>
                                </tr>
                            </thead>
                            <tbody id="carousel-content">
                                @for (int i = 0; i < Model.Count(); i++)
                                {
                                    <tr>
                                        <th><input type="number" value="@Model[i].getId()" name="id" hidden readonly /></th>
                                        <th scope="row">
                                            <img src="@Url.Content(Model[i].getImgLoc())" name="imgLoc" class="carousel-img-thumbnail" alt="Image" />
                                        </th>
                                        <td>
                                            @Html.TextBoxFor(model => model[i].orderNum, Model[i].getOrderNum().ToString(), new { type = "number", name = "orderNum" })
                                        </td>
                                        <td>
                                            <a class="btn btn-danger btn-lg btn-block openDeleteModal" data-toggle="modal" href="#deleteImageModal" data-id="@Model[i].getId()">
                                                DELETE
                                            </a>
                                        </td>
                                    </tr>
                                }
                            </tbody>
                        </table>
                    </div>
                </div>
                <div class="row form-button-group">
                    <div class="col-md-6 col-sm-12 form-button-padding">
                        <button type="button" class="btn btn-success btn-lg btn-block" data-toggle="modal" data-target="#addImageModal">
                            + Add New Image
                        </button>
                    </div>
                    <div class="col-md-6 col-sm-12 form-button-padding">
                        <button type="submit" class="btn btn-primary btn-lg btn-block">
                            Save Changes
                        </button>
                    </div>
                </div>
            }

控制器:

// POST: Saves Carousel Image Data
    [HttpPost]
    public ActionResult SaveCarouselImageData(List<CarouselModel> images)
    {
        if (!checkLoginCredentials())
        {
            return RedirectToAction("Login", "Home");
        }
        else
        {
            List<CarouselModel> updatedModels = new List<CarouselModel>();
            foreach (CarouselModel img in images)
            {
                CarouselModel dbModal = siteServices.getCarouselImageById(img.getId());
                dbModal.setOrderNum(img.getOrderNum());
            }

            int result = siteServices.updateCarouselTable(updatedModels);

            return RedirectToAction("HomepageCarousel", "Admin");
        }
    }

型号:

public class CarouselModel
{
    [Display(Name="id")]
    private int id;

    [Display(Name = "imgLoc")]
    private string imgLoc;

    [Display(Name = "orderNum")]
    public int orderNum;

    public int getId()
    {
        return this.id;
    }

    public string getImgLoc()
    {
        return this.imgLoc;
    }

    public int getOrderNum()
    {
        return this.orderNum;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public void setImgLoc(string imgLoc)
    {
        this.imgLoc = imgLoc;
    }

    public void setOrderNum(int orderNum)
    {
        this.orderNum = orderNum;
    }
}

同样,模型本身当前正从视图传递到 SaveCarouselImageData 方法的列表中,但它们的所有 属性 值都为 null 或 0。

请协助。

all of their property values are null or 0.

我认为那是因为您的 CarouselModel 的属性缺少 get;set; ASP.NET MVC 绑定默认使用的属性。

在 POST 期间,活页夹将尝试将表单值绑定到模型的值,但由于它缺少访问器,因此无法设置来自表单的任何值。

除此之外,它们都被指定为Private,只能在class内访问,如果你想在外部设置它们,你应该使用Public

最简单的解决方案是使它们 Public 并添加访问器 get;set;:

[Display(Name="id")]
public int id {get;set;}

[Display(Name = "imgLoc")]
public string imgLoc {get;set;}

[Display(Name = "orderNum")]
public int orderNum {get;set;}

如果您仍然希望 ID 和 ImgLoc 保留 Private 那么,您可以这样做;

private int _id {get;set;}

private string _imgLoc {get;set;}

[Display(Name = "orderNum")]
public int orderNum;

[Display(Name="id")]
public int id{
   get{
      return this._id;
   }
   set{
      this._id = value;
   }
}

[Display(Name = "imgLoc")]
public string imgLoc{
   get{
      return this._imgLoc;
   }
   set{
      this._id = value;
   }
}

然后更改 HTML 输入字段以使用 public 属性。