我有一個表類別ID和父類別ID。類別和子類別單下拉列表中爲 - MVC剃刀
Category Id Category Name Parent Category Id
1 Desktop 0
2 PC 1
3 Mac 1
如何在下拉列表返回它在下面的格式:
我有一個表類別ID和父類別ID。類別和子類別單下拉列表中爲 - MVC剃刀
Category Id Category Name Parent Category Id
1 Desktop 0
2 PC 1
3 Mac 1
如何在下拉列表返回它在下面的格式:
我能想到的最好的事情是創建一些類保持名稱和值一下拉列表並使用它在你的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)
這應該工作,或至少是這樣的。
嗨,哥們我找了這麼多,我找不到它,但最後我自己編碼。
我會試着告訴你我是如何解決這個問題的,並且像我的截圖一樣工作得很好。這裏是我的secreenshot
這裏是我的類模型,它幾乎與UR模式相同
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;
}
}
}
我的代碼可能看起來很複雜,但實際上並不是。
當我看着模型時,會看到3個selectlistitem屬性,在我的ViewModelCategory模型中有一些重要的東西。我想先談談這些。
我創建了其中一個名爲「類別」的主類別沒有任何父母id值。 其中第二個叫做「ChildCategories」僅包含具有父母ID值的子類別
當你看到他的控制器代碼時,你會看到。
和最後一個叫做「AllCategories」。這是一個重要的一步,我將這個屬性中的所有類別合併爲控制器視圖中的類別下拉列表。但它不僅僅是爲了這個,我也在這個屬性中做了一些重要的事情,當我看到你將看到的循環時,我將它們合併了。我使用的環路放置類別,他們的父母
然後用我的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(),
};
最後我歡迎我DATAS從視圖這樣
<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>
希望你會喜歡這有美好的一天
你想要每個項目的價值是什麼? – bsayegh
@bsayegh,我不明白你的意思是「你想要每個項目的價值是什麼?」。我想返回一個查詢來以這種格式填充下拉列表,例如類別ID - >父類別ID。 – uikrosoft