Модели не собирают значения из метода View в метод HttpPost Controller - PullRequest
1 голос
/ 09 марта 2020

В настоящее время я пытаюсь передать список моделей из моего обзора на мой контроллер. В настоящее время я могу взять каждую модель из представления и поместить их в список и передать список в методе ActionResult контроллера HttpPost. Однако при этом ни у одной из моделей нет своих данных, так как все модели имеют значения свойств, равные 0 или нулю. Мой код выглядит следующим образом:

Вид:

@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, но все значения их свойств равны нулю или 0.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 09 марта 2020

все значения их свойств равны нулю или 0.

Я думаю, это потому, что в свойствах вашего CarouselModel отсутствует get;set;, что делает ASP. NET MVC Binding использование по умолчанию.

Во время 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 и ImgLo c оставались 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, чтобы использовать свойства publi c.

...