Поле выбора вложенной категории - PullRequest
0 голосов
/ 11 ноября 2018
public class Category
{
    [Key]
    [Display(Name = "ID")]
    public int Id { get; set; }

    [Display(Name = "Parent Category")]
    public int? ParentId { get; set; }

    [Required]
    [Display(Name = "Category Name")]
    public string Name { get; set; }

    [Required]
    [Range(0, int.MaxValue)]
    [Display(Name = "Display Order")]
    public int DisplayOrder { get; set; }

    [Required]
    [Display(Name = "Active")]
    public bool IsActive { get; set; }

    [Display(Name = "Created At")]
    public DateTime CreatedAt { get; set; }

    [Display(Name = "Updated At")]
    public DateTime UpdatedAt { get; set; }

    [ForeignKey("ParentId")]
    public virtual Category Parent { get; set; }
}

Вот моя категория модал.Я хочу, чтобы этот модал был вложен в тег выбора как этот:

Автомобиль- Машины- БМВ- АудиНедвижимость- Жилой-- Продаетсяи т.д ...

Я также использовал шаблон репозитория в своем проекте.Все необходимые файлы перечислены ниже по порядку.

Интерфейсы:

public interface IRepository<T> where T : class
{
    IEnumerable<T> List();
    T Find(int? id);
    T Find(Func<T, bool> predicate);
    void Create(T entity);
    void Update(T entity);
    void Delete(T entity);
    int Count(Func<T, bool> predicate);
    void Add(T entity);
    void Save();
}

public interface ICategoryRepository : IRepository<Category>
{
    IEnumerable<Category> ListParentCategories();
}

В связанном виде:

@model GoldenStore.Models.ViewModels.CategoryViewModel
@using GoldenStore.Extensions

<select asp-for="Category.ParentId" asp-items="Model.Categories.ToSeceltListItem(Model.Category.Id)" class="input-select">
     <option value="">Main Category</option>
</select>

В папке расширений:

public static class ReflectionExtension
{
    public static string GetPropertyValue<T>(this T item, string propertyName)
    {
        return item.GetType().GetProperty(propertyName).GetValue(item, null).ToString();
    }
}

public static class IEnumerableExtension
{
    public static IEnumerable<SelectListItem> ToSeceltListItem<T>(this IEnumerable<T> items, int selectedValue)
    {
        return from item in items
               select new SelectListItem
               {
                   Text = item.GetPropertyValue("Name"),
                   Value = item.GetPropertyValue("Id"),
                   Selected = item.GetPropertyValue("Id").Equals(selectedValue.ToString())
               };
    }
}

CategoryViewModel:

public class CategoryViewModel
{
    public Category Category { get; set; }
    public IEnumerable<Category> Categories { get; set; }
}

Поэтому, что я должен сделать для такой вложенной категории:

Автомобиль- Машины- БМВ- АудиНедвижимость- Жилой-- Продаетсяи т.д ...

...