Получение значений из представления в контроллер во вложенном model_ASP.NET MVC - PullRequest
1 голос
/ 15 апреля 2019

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

Я попытался передать также весь Product или ProducWithAttributes, но он всегда отображается как ноль в контроллере AddToCart.

"Базовые" классы

namespace EcommerceWebsite_1.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Prod_Attribute
    {
        public int product_id { get; set; }
        public string property_name { get; set; }
        public string property_value { get; set; }

        public virtual Product Product { get; set; }
    }
}
namespace EcommerceWebsite_1.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Product
    {

        public int current_quantity { get; set; }
        public int product_id { get; set; }
        public string name { get; set; }
        public decimal price { get; set; }
        public string cat_name { get; set; }
        public byte[] image { get; set; }
        public Nullable<int> Merchandise_payment_order_id { get; set; }
        public bool out_of_stock { get; set; }
        public Nullable<int> max_amnt_per_order { get; set; }


    }
}


Классы (вложенные в Контроллер продуктов)

public class ProductWithAttributes
        {
            public Product Prod { get; set; }
            public List<Prod_Attribute> Prod_attributes { get; set; }
            public int selectedQuant { get; set; }


        }
       public class ProductWithQuant
        {
            public int prod_id { get; set; }
            public int selectedQuant { get; set; }



        }

«Вызывающий» контроллер

public ActionResult DetailsForUser(int id)
        {

            Product product = db.Products.Find(id);

            List<Prod_Attribute> attributes_vals = db.Prod_Attribute.Where(p => p.product_id == id).OrderBy(c => c.property_name).ToList();
            int quantity_selection;
            if (product.max_amnt_per_order!= null)
            {
                quantity_selection = (int)product.max_amnt_per_order;
               }
            else
            {
                quantity_selection = product.current_quantity;
            }

            int[] quantity_selection_list = new int[quantity_selection];

            for (int i=1; i<= quantity_selection; i++)
            {
                quantity_selection_list[i - 1] = i;

            }

            ViewBag.Quantities = quantity_selection_list;

            return View(new ProductWithAttributes
            {
                Prod = product,
                Prod_attributes = attributes_vals
            });
        }

View

@using EcommerceWebsite_1.Models
@model EcommerceWebsite_1.Controllers.ProductsController.ProductWithAttributes

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Product</h4>
    <hr />

    <dl class="dl-horizontal">


        <dt>
            @Html.DisplayNameFor(model => model.Prod.name)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Prod.name)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Prod.price)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Prod.price)
        </dd>

        <dd>
            @Html.DisplayFor(model => model.Prod.image)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Prod.max_amnt_per_order)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Prod.max_amnt_per_order)
        </dd>
        @foreach (Prod_Attribute attr in Model.Prod_attributes)
        {
            <dt>
                @Html.DisplayFor(model => attr.property_name)
            </dt>

            <dd>
                @Html.DisplayFor(model => attr.property_value)
            </dd>
        }
        <dd class="form-group">
            @Html.Label("Desired Quantity: ", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.selectedQuant, new SelectList(ViewBag.Quantities), "Select Quantity...", htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessage("", new { @class = "text-danger" })
            </div>
        </dd>
    </dl>
</div>
<p>
    @Html.ActionLink("Add to Cart", "AddtoCart", new { product_id = Model.Prod.product_id, selectedQuant = Model.selectedQuant})
    @Html.ActionLink("Back to List", "IndexByCategory", new { cat_name = Model.Prod.cat_name })
</p>

Final Controller (... который показывает только нулевые аргументы)

public ActionResult AddToCart([Bind(Include = "product_id, selectedQuan")] ProductWithQuant prod_added_To)
        {

            if ((System.Web.HttpContext.Current.User != null) && System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
            {


                Product product = db.Products.Find(prod_added_To.prod_id);

                Added_to newAddition = new Added_to
                {
                    product_id = prod_added_To.prod_id,
                    member_id = User.Identity.GetUserId(),
                    time_product_added = DateTime.Now,
                    quantity = prod_added_To.selectedQuant,
                    discounted_price = (decimal) CalcDiscountPrice(product)


                };


                db.Added_to.Add(newAddition);

                db.SaveChanges();
                return View(product);
            }
            else
            {
                string returnUrl = Request.Url.Host + "/Products/IndexForUser/" + prod_added_To.prod_id.ToString();
                return RedirectToAction("Login", "Account", returnUrl );
            }

Модель представления - это объект, имеющий другой объект Product и список объектов, Prod_attributes. Я пытаюсь получить выбранное значение количества продукта, который пользователь хочет приобрести, а затем передать другому контроллеру только идентификатор продукта и выбранное количество. В качестве альтернативы, я мог бы передать весь объект Product и выбранное количество. Я пробовал разные комбинации, но ничего не работает, потому что я получаю ноль, полученный конечным контроллером, Login. Что я делаю неправильно? Спасибо заранее. Мне нужно решение как можно скорее.

...