2014-04-16 4 views
0

У меня есть таблица с идентификатором категории и идентификатором категории родителя.Категория и подкатегория в одном каталоге Dropdownlistfor - MVC Razor

Category Id Category Name Parent Category Id 
    1   Desktop    0 
    2   PC     1 
    3   Mac     1 

Как вернуть его в DropDownList в приведенном ниже формате:

enter image description here

+0

Что вам нужно, чтобы значение каждого элемента было? – bsayegh

+0

@bsayegh, я не понимаю, что вы подразумеваете под «Что вы хотите, чтобы ценность каждого элемента была?». Я хочу вернуть запрос, чтобы заполнить выпадающий список в этом формате, например. Идентификатор категории -> Идентификатор категории родителя. – uikrosoft

ответ

0

Самое лучшее, что я могу думать о том, чтобы создать какой-то класс, держать имя и значение для выпадающий список и использовать его для создания SelectList в своем действии.

public class SelectListValue{ 
    public string Text {get;set;} 
    public string Value {get;set;} 
} 

public ActionResult SomeActionMethod() 
{ 
    var categories = GetCategories() //Get your list of categories 
    var selectListItems = new List<SelectListValue>(); 

    foreach(var item in categories) 
    { 
    var text = GetCategoryDisplay() //You will need to figure out how to generate the text, like Components > Web Cameras. This doesn't need to be a method. It could be a property on the Category object. 

    selectListItems.Add(new SelectListValue {Text = text, Value = item.CategoryId.ToString()}); 
    } 

    ViewData["CategoryList"] = new SelectList(selectListItems, "Value", "Text"); 
} 

Вам нужно будет куда-нибудь, возможно, в вашей модели, чтобы сгенерировать строку имени. Я предполагаю, что вы уже это делаете. Тогда, на ваш взгляд, вы сделаете что-то вроде

@Html.DropDownListFor(x => x.CategoryId, ViewData["CategoryList"] as SelectList) 

Это должно работать, или, по крайней мере, что-то в этом роде.

1

привет, приятель, я искал это много, и я не мог его найти, но, наконец, я сам его закодировал.

Я постараюсь рассказать вам, как я решил эту проблему и отлично работает, как ур скриншот. вот мой secreenshot

здесь моя категория модель, она почти то же самое с ур модель

public class Category 
 
      { 
 
       public int ID { get; set; } 
 
       public string CategoryName { get; set; } 
 

 
       public int? ParentID { get; set; } 
 

 
       [ForeignKey("ParentID")] 
 
       public virtual ICollection<Category> SubCategories { get; set; } 
 
      }

тогда я создал модель Просмотр категории как этот

public class ViewModelCategory 
 
    { 
 
     public Category Category { get; set; } 
 
     public List<SelectListItem> Categories { get; set; } 
 
     public List<SelectListItem> ChildCategories { get; set; } 
 

 
     public List<SelectListItem> AllCategories 
 
     { 
 
      get 
 
      { 
 
       List<SelectListItem> sli = new List<SelectListItem>(); 
 
       foreach (SelectListItem item in Categories) 
 
       { 
 
        sli.Add(item); 
 
       } 
 
       foreach (SelectListItem item in ChildCategories) 
 
       { 
 
        int i = item.Text.IndexOf(">"); 
 
        string text = item.Text.Substring(0, i-1); 
 
        foreach (SelectListItem listItem in ChildCategories) 
 
        { 
 
         int k = listItem.Text.LastIndexOf(">"); 
 
         string text2 = listItem.Text.Substring(k+1); 
 
         if (text2.Contains(text)) 
 
         { 
 
          item.Text = listItem.Text + " > " + item.Text.Substring(i+2); 
 
         } 
 
        } 
 
        sli.Add(item); 
 
       } 
 
       return sli; 
 
      } 
 
     } 
 
    }

мои коды могут выглядеть немного усложненными, но на самом деле это не так.

есть что-то важное в моей модели ViewModelCategory, когда вы посмотрите на модель u, увидите 3 свойства selectlistitem. Я хочу поговорить об этом в первую очередь.

Я создал один из них, называемый «Категории» для основных категорий, который не имеет никакого значения родительского идентификатора. Вторая из них, называемая «ChildCategories», содержит только подкатегории, которые имеют значение родительского идентификатора

, когда вы посмотрите на коды контроллера u, вы увидите уже.

и последний из названных «AllCategories». это один из важных, я объединил все категории в этом свойстве, чтобы отправить категории в dropdownlis для просмотра контроллера. но это не только для этого, я также сделал что-то важное в этом свойстве, в то время как я слил их, когда и посмотрю на петли, и увижу это.я использовал петлю для размещения категории для своих родителей

затем использовал мою ViewModelCategory модель контроллера, как этого

ViewModelCategory vmc = new ViewModelCategory 
 
      { 
 
       Category = category, 
 
       Categories = _businessCategories.GetItems().Where(x => x.ParentID == null).Select(x => new SelectListItem 
 
       { 
 
        Text = x.CategoryName, 
 
        Value = x.ID.ToString() 
 
       }).ToList(), 
 
       
 
       ChildCategories = _businessCategories.GetItems().Where(x=>x.ParentID != null).Select(x => new SelectListItem 
 
       { 
 
        Text = _businessCategories.GetItems().Where(a => a.ID == x.ParentID).FirstOrDefault().CategoryName + " > " + x.CategoryName, 
 
        Value = x.ID.ToString() 
 
       }).ToList(), 
 
      };

и, наконец, я приветствовал мои ДАННЫЕ из поля зрения, как этот

<div class="form-group"> 
 
        <label class="col-sm-4 control-label">Sub Category</label> 
 
        <div class="col-sm-8"> 
 
         @Html.DropDownListFor(model => model.Category.ParentID, Model.AllCategories.OrderBy(x=>x.Text), "Select Category", new {@class = "form-control"}) 
 
         @Html.ValidationMessageFor(model => model.Category.ParentID) 
 
        </div> 
 
       </div>

Надеюсь, вам понравится, что у вас будет хороший день