Tshumore Ответов: 1

Как повторно использовать переменную сеанса в двух разных представлениях razor


Я пытаюсь реализовать функцию проверки в своем приложении корзины покупок, и у меня возникли проблемы с повторным использованием переменной сеанса. Переменная сеанса представляет собой общую сумму заказа и определяется в представлении razor корзины покупок . Переменная работает хорошо и увеличивается соответствующим образом всякий раз, когда я добавляю товар в корзину. Пользователь нажмет кнопку Перейти к оформлению заказа после завершения добавления товаров, а затем перенаправится на страницу оформления заказа, где также должна быть показана общая сумма заказа.

На странице оформления заказа отображается значение 0, даже если переменная сеанса имеет значение (из представления корзины)

<pre> @{
    int sum = 0;
        }

        @{
            Session["OrderTotal"] = sum;
        }
<div class="container-fluid">
    <div class="row">
        <div class="col-12 col-lg-8">
            <div class="cart-title mt-50">        
            </div>

            <div class="cart-table clearfix">
                <table class="table table-responsive" tabindex="1" style="overflow: hidden; outline: none;">
                    <thead>
                        <tr>                         
                            <th>Product</th>                         
                            <th>Price</th>
                            <th>Quantity</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach (var item in Model)
                        {
                        <tr>
                                                   <td class="cart_product_desc">
                                <h5>@item.Quantity</h5>
                            </td>
                            <td>

                                <button id="" class="" data-slno="@item.ProductId" onclick="location.href='@Url.Action("Remove","Home",item)'">
                                    <img src="~/assets/img/core-img/xxx.png" height="30" width="30" />
                                </button>
                            </td>
                        </tr>
                        }
                    </tbody>

                    @foreach (var x in Model)
                    {

                        sum = Convert.ToInt32(x.Price) + sum;

                    }
                </table>
            </div>
        </div>
        <div class="col-12 col-lg-4">
            <div class="cart-summary">
                <h5>Cart Total</h5>
                <ul class="summary-table">
                    <li><span>subtotal:</span> <span>$0.00</span></li>
                    <li><span>delivery:</span> <span>Free</span></li>
                    <li><span>total:</span> <span>$@sum</span></li>
                </ul>
                <div class="cart-btn mt-100">
                    <span> <a href="~/Home/Checkout" class="btn amado-btn mb-15">Checkout</a></span> <span><a href="#" class="btn amado-btn mb-15">Continue Shopping</a></span>
                   
                    
                </div>
            </div>
        </div>
    </div>
</div>


Что я уже пробовал:

Вот как я пытаюсь повторно использовать переменную сеанса OrderTotal в представлении Checkout :

<pre>    @model IEnumerable<NdinemiEshop.Product>
        @{
            ViewBag.Title = "Cart";
            Layout = "~/Views/Shared/_LayoutCart.cshtml";
        }

<div class="container-fluid">
    <div class="row">
        <div class="col-12 col-lg-8">
            <div class="checkout_details_area mt-50 clearfix">

                <div class="cart-title">
                    <h2>Checkout</h2>
                </div>

                <form action="#" method="post">
                    <div class="row">
                        <div class="col-md-6 mb-3">

                            @Html.EditorFor(model => model.Initiator, new { htmlAttributes = new { @class = "form-control", @placeholder = "Buyer Name" } })
                            @Html.ValidationMessageFor(x => x.Initiator, "", new { @class = "text-danger" })
                            @*<input type="text" class="form-control" id="first_name" value="" placeholder="Sender Name" required="">*@
                        </div>
                        <div class="col-md-6 mb-3">

                            @Html.EditorFor(model => model.Recipient, new { htmlAttributes = new { @class = "form-control", @placeholder = "Recipient Name" } })
                            @Html.ValidationMessageFor(x => x.Recipient, "", new { @class = "text-danger" })
                            @*<input type="text" class="form-control" id="last_name" value="" placeholder="Recipient Name" required="">*@
                        </div>
                        <div class="col-12 mb-3">
                            @Html.EditorFor(model => model.CardNo, new { htmlAttributes = new { @class = "form-control", @placeholder = "Card No" } })
                            @Html.ValidationMessageFor(x => x.CardNo, "", new { @class = "text-danger" })
                            @*<input type="text" class="form-control" id="company" placeholder="Company Name" value="">*@
                        </div>
                        <div class="col-12 mb-3">
                            @Html.EditorFor(model => model.CvvNo, new { htmlAttributes = new { @class = "form-control", @placeholder = "Cvv No" } })
                            @Html.ValidationMessageFor(x => x.CvvNo, "", new { @class = "text-danger" })
                            @*<input type="email" class="form-control" id="email" placeholder="Email" value="">*@
                        </div>
                        <div class="col-12 mb-3">
                            @Html.EditorFor(model => model.Expires, new { htmlAttributes = new { @class = "form-control", @placeholder = "Card Expiration" } })
                            @Html.ValidationMessageFor(x => x.Expires, "", new { @class = "text-danger" })
                            @*<input type="email" class="form-control" id="email" placeholder="Email" value="">*@
                        </div>
                     
                      

                      
                </form>
            </div>
        </div>
        <div class="col-12 col-lg-4">
            <div class="cart-summary">
                <h5>Cart Total</h5>
                <ul class="summary-table">
                    <li><span>subtotal:</span> <span>$140.00</span></li>
                    <li><span>delivery:</span> <span>Free</span></li>
                    <li><span>total:</span> <span>$@Session["OrderTotal"]</span></li>
                </ul>

              
            </div>
        </div>
    </div>
</div>


Что я упускаю?

1 Ответов

Рейтинг:
9

Richard Deeming

Цитата:
int sum = 0; // Set the local variable "sum" to zero;
Session["OrderTotal"] = sum; // Store zero in the session variable;
...
foreach (var x in Model)
{
    // Update the local variable - doesn't touch the session:
    sum = Convert.ToInt32(x.Price) + sum; 
}
Вы не сохраняете сумму в сеансе.

Переместите строку, задающую переменную сеанса, в конец представления.

А еще лучше переместите вычисления и сеансовый доступ к действию и держите его вне поля зрения. Или попросите ваше действие оформления заказа загрузить общую сумму из того же хранилища данных, что и действие корзины.