Hi all!
Please help me - need on View display RadioButtonList and fill data from Model. After submit need saves selected value of RadioButtonList.
My Model:
public class ProductListModel
{
public ProductListModel()
{
CheckBoxForColor = new List<CheckBoxModel>();
RadioButtonListSortBy = new List<RadioButtonModel>();
}
public IPagedList<Product> PageList { get; set; }
public List<CheckBoxModel> CheckBoxForColor { get; set; }
public List<RadioButtonModel> RadioButtonListSortBy { get; set; }
public string ProductType { get; set; }
public string Firstload { get; set; }
}
Action method in controller:
public ActionResult ProductList(int? page, ProductListModel viewModel)
{
ProductContext dbProduct = new ProductContext();
List<Product> products = null;
List<string> allProductColors = dbProduct.ProductProperties.Select(x => x.Color).Distinct().ToList();
List<string> allProductColorsMetal = dbProduct.ProductProperties.Select(x => x.ColorMetal).Distinct().ToList();
List<string> allProductVstavka = dbProduct.ProductProperties.Select(x => x.Vstavka).Distinct().ToList();
if (viewModel.Firstload != null) //not first load
{
IQueryable<ProductProperty> productProperties = dbProduct.ProductProperties;
List<string> selectedProductColor = viewModel.CheckBoxForColor.Where(x => x.IsChecked).Select(x => x.Value).ToList();
if (selectedProductColor.Count != 0)
{
productProperties = productProperties.Where(p => selectedProductColor.Contains(p.Color));
}
products = productProperties.Select(x => x.Product).ToList();
}
else //first load
{
foreach (string productColor in allProductColors)
{
viewModel.CheckBoxForColor.Add(new CheckBoxModel {Value = productColor});
}
viewModel.RadioButtonListSortBy.Add(new RadioButtonModel {IsChecked = false, Name = "sorting", Value = "Price"});
viewModel.RadioButtonListSortBy.Add(new RadioButtonModel {IsChecked = false, Name = "sorting", Value = "Sale" });
viewModel.RadioButtonListSortBy.Add(new RadioButtonModel {IsChecked = true, Name = "sorting", Value = "No" });
products = dbProduct.Products.ToList();
}
int pageSize = 4;
int pageNumber = (page ?? 1);
IPagedList<Product> pageList;
if(!string.IsNullOrEmpty(viewModel.ProductType))
{
pageList = products.Where(p => p.ProductType == viewModel.ProductType).ToPagedList(pageNumber, pageSize);
}
else
{
pageList = products.ToPagedList(pageNumber, pageSize);
}
viewModel.PageList = pageList;
return View(viewModel);
}
My View:
<div class="product_list_filter">
@using (Html.BeginForm("ProductList", "Product", FormMethod.Get))
{
<p>
<h4>Filter:</h4>
<h5>Color:</h5>
@for (var i = 0; i < Model.CheckBoxForColor.Count; i++)
{
<div>
@Html.HiddenFor(x => x.CheckBoxForColor[i].Value)
@Html.CheckBoxFor(x => x.CheckBoxForColor[i].IsChecked)
<label>@Model.CheckBoxForColor[i].Value</label>
</div>
}
<div> <label> Sorting by: </label>
<div class="form-group">
<div class="col-md-10">
@foreach (var a in Model.RadioButtonListSortBy)
{
<p>
@Html.RadioButtonFor(b => b.RadioButtonListSortBy, a.IsChecked, a.Value) @a.Value
</p>
}
</div>
</div>
</div>
<input type="hidden" name="firstload" value="true"/>
<input type="hidden" name="productType" value="@ViewBag.productType"/>
<input type="hidden" name="sortProductBy" value="@ViewBag.sortProductBy"/>
<div class="list_buttons">
<input type="submit" value="Apply"/>
</div>
</p>
}
</div>