У меня много проблем с попыткой заставить мой 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. Что я делаю неправильно? Спасибо заранее. Мне нужно решение как можно скорее.