【问题标题】:Models not collecting values from View to HttpPost Controller Method模型没有从 View 收集值到 HttpPost 控制器方法
【发布时间】:2020-06-20 22:05:22
【问题描述】:

我目前正在尝试将模型列表从我的视图传递到我的控制器。目前,我能够从视图中获取每个模型并将它们放在一个列表中,并在 HttpPost 控制器 ActionResult 方法中传递该列表。但是,在执行此操作时,所有模型都没有数据,因为所有模型的属性值都设置为 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;
    }
}

同样,模型本身目前正在从 View 传递到 SaveCarouselImageData 方法的 List 中,但它们的所有属性值都是 null 或 0。

请帮忙。

【问题讨论】:

    标签: asp.net-mvc model-view-controller model http-post actionresult


    【解决方案1】:

    它们的所有属性值都是 null 或 0。

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

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

    除此之外,它们都被指定为Private,只能在类中访问,如果你想在外部设置它们,你应该使用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 输入字段以使用公共属性。

    【讨论】:

    • 是的!这正是问题所在。对于此应用程序,将它们设为私有并不是什么大问题,但也会尝试第二个选项。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2014-09-08
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多