Фильтр модели Ajax для нескольких привязок DropDownList
У меня есть проблема, которую я не знаю, как ее решить (с точки зрения кода), и я хотел бы получить некоторую информацию от сообщества.
Итак, у меня есть страница, где я буду отображать сведения о продукте, и эти данные будут варьироваться в зависимости от значений, выбранных в DropDownList (DDL). Итак, для каждого продукта у меня есть коллекция вариантов указанного продукта, которые идентифицируются уникальным идентификатором и массивом атрибутов уникального идентификатора JSON, например:
[
{
"AttributeId": "fe153d69-8ac1-6e0c-8793-ff0000804eb3",
"AttributeValueId": "64163d69-8ac1-6e0c-8793-ff0000804eb3"
},
{
"AttributeId": "00163d69-8ac1-6e0c-8793-ff0000804eb3",
"AttributeValueId": "67163d69-8ac1-6e0c-8793-ff0000804eb3"
}
]
Это говорит мне о том, что этот конкретный вариант имеет Days
атрибут со значением 5, а Portions
значение атрибута 4 и т. д.
Для этого конкретного продукта у меня также есть другие значения / варианты с той же схемой. Вот мои возможные значения:
Days | Portions
3 2
3 4
3 6
5 4
Теперь в моем View я привязываю два DDL к каждому из этих атрибутов (один для дней, один для порций).
Вот мой метод контроллера:
public ActionResult Details(Guid productId)
{
CatalogManager catalogManager = CatalogManager.GetManager();
EcommerceManager ecommerceManager = EcommerceManager.GetManager();
ProductListWidgetModel model = new ProductListWidgetModel();
model.Product = catalogManager.GetProduct(productId);
//Read the variant properties
JavaScriptSerializer serializer = new JavaScriptSerializer();
model.ProductVariations = catalogManager.GetProductVariations(productId).ToList();
model.Portions = new List<SelectListItem>();
model.Meals = new List<SelectListItem>();
foreach (var item in model.ProductVariations)
{
List<AttributeValuePair> attributeValuePairs = serializer.Deserialize<List<AttributeValuePair>>(item.Variant);
foreach (var attribute in attributeValuePairs)
{
if (catalogManager.GetProductAttribute(attribute.AttributeId).Title == "Portions")
{
var attributes = catalogManager.GetProductAttributeValue(attribute.AttributeValueId);
if (!model.Portions.Exists(x => x.Value == attributes.Title))
{
model.Portions.Add(new SelectListItem { Value = attributes.Id.ToString(), Text = attributes.Title });
}
}
if (catalogManager.GetProductAttribute(attribute.AttributeId).Title == "Days")
{
var attributes = catalogManager.GetProductAttributeValue(attribute.AttributeValueId);
if (!model.Meals.Exists(x => x.Value == attributes.Title))
{
model.Meals.Add(new SelectListItem { Value = attributes.Id.ToString(), Text = attributes.Title });
}
}
}
}
return View("Detail", model);
}
И моя модель:
public class ProductListWidgetModel
{
/// <summary>
/// Gets or sets all the messages.
/// </summary>
public string Message { get; set; }
public string Title { get; set; }
public string SubTitle { get; set; }
public Product Product { get; set; }
public List<Product> ProductsList { get; set; }
public List<ProductVariation> ProductVariations { get; set; }
public List<SelectListItem> Portions { get; set; }
public List<SelectListItem> Meals { get; set; }
}
А также мой взгляд:
<table>
<tr>
<th id="row">@Html.DropDownList("MealsSelector", @Model.Meals } )</th>
<td id="row">Middager</td>
</tr>
<tr>
<th id="row">@Html.DropDownList("PortionsSelector", @Model.Portions)</th>
<td id="row">Porsjoner</td>
</tr>
</table>
Но что мне действительно нужно сделать, так это чтобы в DDL с привязанными порциями отображались только возможные значения, основанные на DDL дней, поэтому, если я выбрал 5 Days, у меня должен был быть выбор только 4 порций в DDL порций.
Как мне этого добиться? В идеале я бы предпочел сделать это через Ajax или простой фильтр LINQ, чтобы сделать это.
Кто-нибудь может подсказать мне, как связать эти DDL друг с другом?