我有一个包含类别ID和父类别ID的表。
Category Id Category Name Parent Category Id
1 Desktop 0
2 PC 1
3 Mac 1
如何在以下格式的下拉列表中返回它:
答案 0 :(得分: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模型中有一些重要内容你会看到3个selectlistitem属性。我想先谈谈这些。
我为其中没有任何父ID值的主要类别创建了其中一个称为“类别”的类别。 其中第二个称为“ChildCategories”仅包含具有父ID值
的子类别当你看到他将看到的控制器代码时。
和最后一个称为“AllCategories”。这个是重要的一个,我合并了这个属性中的所有类别,以便在控制器的视图中向dropdownlisfor发送类别。但它不仅仅是因为我在这个属性中也做了一些重要的事情,而当我看到循环时我会合并它们你会看到它。我使用循环将类别分类给他们的父母
然后在控制器中使用我的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>
希望你会喜欢这个美好的一天
答案 1 :(得分:0)
我能想到的最好的事情是创建一个包含下拉列表名称和值的类,并使用它在Action中创建一个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)
这应该有用,或者至少是类似的东西。