не удалось обновить или отредактировать указанные c данные в методе HTTP post - PullRequest
1 голос
/ 06 августа 2020

Я хотел обновить значение количества. для этого я использую метод HTTPPost индекса для количества обновлений. но не могло из-за ошибки. вот мой код:

   
        public IActionResult Index()
        {
            return View(_db.Shop.Include(c => c.Category).Include(f => f.SubCategory).ToList());
        }

        [HttpPost]
        public IActionResult Index(int? id)
        {
            var product = _db.Shop.Where(x => x.Id == id).FirstOrDefault();

            IndexVm ji = new IndexVm 
            {
              
                Id = product.Id,
                Image = product.Image,
                Image1 = product.Image1,
                Quantity = product.Quantity++,
                Price = product.Price,
                PreviousPrice = product.PreviousPrice,
                Description = product.Description,
            };

            _db.Shop.Update(ji);
            _db.SaveChanges();
            return RedirectToAction(nameof(Index));
        }

Index.cs html

    @using Amazon.Models
@model IEnumerable<Shop>


@{
    ViewData["Title"] = "Index";
}

<br /><br />

<div class="row">
    <div class="col-6">
        <h2 class="text-info">Product List</h2>
    </div>

    <div class="col-6 text-right">
        <a asp-action="Create" class="btn btn-info">&nbsp;Add New Product </a>
    </div>

</div>

<form asp-action="Create" method="post" enctype="multipart/form-data">


    <div>
        <table class="table table-striped border" id="myTable">

            <thead>

                <tr class="table-info">
                    <th>
                        @Html.DisplayNameFor(c => c.Name)

                    </th>
                    <th>
                        @Html.DisplayNameFor(c => c.Price)

                    </th>
                    <th>
                        @Html.DisplayNameFor(c => c.PreviousPrice)

                    </th>
                    <th>
                        @Html.DisplayNameFor(c => c.Quantity)

                    </th>
                    <th>
                        @Html.DisplayNameFor(c => c.Description)

                    </th>
                    <th>
                        @Html.DisplayNameFor(c => c.Quantity)

                    </th>
                    <th>
                        @Html.DisplayNameFor(c => c.CategoryTypeId)

                    </th>
                    <th>
                        @Html.DisplayNameFor(c => c.SubCategoryTypeId)

                    </th>

                    <th></th>
                    <th></th>
                </tr>
            </thead>



            <tbody>
                @foreach (var item in Model)
                {
                    <tr class="text-info">

                        <td>  @item.Name </td>
                        <td>  @item.Price </td>
                        <td>  @item.PreviousPrice </td>



                        <td>@item.Quantity</td>

                        <td>
                            <partial name="_QuantityPartial" model="@item.Id" />
                        </td>



                        <td>  @item.Description </td>
                        <td>  @item.Size </td>
                        <td>  @item.Category.CategoryName </td>
                        <td>  @item.SubCategory.SubCategoryName </td>


                        <td>
                            <partial name="_DeletePartial" model="@item.Id" />
                        </td>
                    </tr>

                }





            </tbody>



        </table>
    </div>
</form>
<br /> <br />

@section scripts{

    <script type="text/javascript">

        $(document).ready(function () {
            $('#myTable').DataTable();
        });



    </script>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script>
        function incrementValue(e) {
            e.preventDefault();
            var fieldName = $(e.target).data('field');
            var parent = $(e.target).closest('div');
            var currentVal = parseInt(parent.find('input[name=' + fieldName + ']').val(), 10);

            if (!isNaN(currentVal)) {
                parent.find('input[name=' + fieldName + ']').val(currentVal + 1);
            } else {
                parent.find('input[name=' + fieldName + ']').val(0);
            }
        }

        function decrementValue(e) {
            e.preventDefault();
            var fieldName = $(e.target).data('field');
            var parent = $(e.target).closest('div');
            var currentVal = parseInt(parent.find('input[name=' + fieldName + ']').val(), 10);

            if (!isNaN(currentVal) && currentVal > 0) {
                parent.find('input[name=' + fieldName + ']').val(currentVal - 1);
            } else {
                parent.find('input[name=' + fieldName + ']').val(0);
            }
        }

        $('.input-group').on('click', '.button-plus', function (e) {
            incrementValue(e);
        });

        $('.input-group').on('click', '.button-minus', function (e) {
            decrementValue(e);
        });

    </script>

   
}











_QuantityPartial.cs html

@model int

<form method="post">
    <td style="width:150px">
        <div class="btn-group">

            @*<a asp-action="Index"  class="btn btn-danger" asp-route-id="@Model">Add</a>*@
            <input type="submit" asp-action="Index" asp-route-id="@Model" value="+" />
        </div>
    </td>
</form>

и вот мой результат и вот мой результат ниже. Я хочу что-то подобное. Я действительно хочу, чтобы когда я нажимал "+", количество обновлялось. и вот мой результат ниже. Я хочу что-то подобное. Я действительно хочу, чтобы когда я нажимал «+», количество обновлялось. для этого здесь я использую метод HTTP post (index), но обнаружил ошибку. для этого я не могу обновить свои количественные данные.

enter image description here введите описание изображения здесь

Я новичок, помогите пожалуйста.

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Вы должны использовать:

var product = _db.Shop.AsNoTracking().Where(x => x.Id == id).FirstOrDefault();

Вы загружаете продукт, но обновляете новый экземпляр ji с тем же идентификатором. Поскольку идентификатор такой же, EF считает, что это два объекта с одинаковым первичным ключом, чего не должно происходить, поэтому возникает ошибка.

Другой вариант - обновить продукт, полученный из базы данных:

        [HttpPost]
        public IActionResult Index(int? id)
        {
            var product = _db.Shop.Where(x => x.Id == id).FirstOrDefault();
            product.Quantity++;

            _db.Shop.Update(product);
            _db.SaveChanges();
            return RedirectToAction(nameof(Index));
        }

Подробнее об этом можно узнать здесь: https://docs.microsoft.com/en-us/ef/core/querying/tracking

1 голос
/ 06 августа 2020

Вы делаете эти две ошибки:

  1. Вы передаете ВМ для функции обновления, которая неверна.

  2. Для обновления любого существующего EF объект, вам необходимо обновить этот объект вместо создания нового.

     {
         var product = _db.Shop.Where(x => x.Id == id).FirstOrDefault();
    
         product.Quantity++;
    
         _db.Shop.Update(product);
         _db.SaveChanges();
         return RedirectToAction(nameof(Index));
     }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...