[英]Dropdown in MVC
在我的MVC應用程序中,我需要添加一個顯示域名列表的下拉列表。
我已經有一個包含多個屬性的ViewModel。 我不確定步驟的順序應該是什么:
ViewModel
? 應該是什么類型? 名單? HTML.DropdownFor
? 我知道我應該在我的問題中加入一些代碼,但是現在我很難開始這個...
編輯:向ViewModel添加以下屬性:
public IEnumerable<SelectListItem> DomainList { get; set; }
並實現了一個返回域列表的方法:
internal static List<Domain> FetchAllDomains()
接下來在我的控制器動作中,我有:
var domains = FetchAllDomains().Select(d => d.DomainName);
return new EmailModel() {DomainList = domains };
但是我收到以下錯誤:
無法將類型'System.Collections.Generic.IEnumerable'隱式轉換為'System.Collections.Generic.IEnumerable'。 存在顯式轉換(您是否錯過了演員?)
1)向我的ViewModel添加一個新屬性? 應該是什么類型? 名單?
您需要2個屬性才能更精確: IEnumerable<SelectListItem>
用於保存所有可用選項,標量屬性用於保存選定值
2)定義一個用值填充上述屬性的方法。
是。
3)在視圖中使用該屬性? 使用HTML.DropdownFor?
不,不在視圖中。 視圖不會調用任何方法。 視圖適用於視圖模型。 控制器有責任將正確填充的視圖模型傳遞給視圖。
例如:
public class MyViewModel
{
public string SelectedValue { get; set; }
public IEnumerable<SelectListItem> Values { get; set; }
... some other properties that your view might need
}
然后是一個控制器動作,它將填充此視圖模型:
public ActionResult Index()
{
var model = new MyViewModel();
model.Values = new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" },
new SelectListItem { Value = "3", Text = "item 3" },
};
return View(model);
}
最后是強類型視圖,您將在其中顯示下拉列表:
@model MyViewModel
@Html.DropDownListFor(x => x.SelectedValue, Model.Values)
更新:
根據您更新的問題,您在視圖模型上有一個IEnumerable<SelectListItem>
屬性,您嘗試為其指定IEnumerable<string>
類型的值,這顯然是不可能的。 您可以將此轉換為IEnumerable<SelectListItem>
如下所示:
var domains = FetchAllDomains().Select(d => new SelectListItem
{
Value = d.DomainName,
Text = d.DomainName
});
return new EmailModel { DomainList = domains };
如果您不介意,我會向您展示一個示例考試列表
public class SomeClass
{
//Properties
public int ExamId { get; set; }
public SelectList ExamList { get; set; }
}
幫手:
public static void PopulateExamList(MarkEditViewModel model,
List<Exam> examList)
{
model.ExamList = new SelectList(examList, "Id", "ExamName");
}
在我的示例中,您必須添加所有考試的標記。 在View中,您將獲得一個考試下拉列表
和View(預測模型中的每個元素):
@Html.DropDownListFor(model => model.ExamId,
Model.ExamList,
"Choose exam")
一旦你的控制器上的列表將其傳遞給視圖(作為模型或使用ViewBag),然后使用幫助器:
Html.DropDownList(
string name,
IEnumerable<SelectListItem> selectList,
string optionLabel,
object htmlAttributes)
或者(MVC 3)
@Html.DropDownListFor(model => model.Property.ID,
new SelectList(model.PropertyList, "ID", "Type"))
在您的ViewModel中
public class ViewModelClass
{
public string DomainName { get; set; }
public IEnumerable<SelectListItem> DomainList
{
get
{
return GetDomainNames() //your method to get domain names
.Select(d => new SelectListItem() { Text = d, Value = d });
}
}
}
你的強類型視圖
@model ViewModelClass
@Html.DropDownListFor(model => model.DomainName, Model.DomainList)
DropDownList
的值 @Html.DropDownListFor()
引用模型的屬性以保證視圖是@Html.DropDownListFor()
您處於正確的軌道,ViewModel中有2個屬性。 一個用於保存UI中所選項目ID的項目列表和其他項目
public class ProductViewModel
{
public IEnumerable<SelectListItem> Items { get; set; }
public string SelectedItemId { get; set; }
//Other Properties
}
在Get Action方法中,返回包含數據的ViewModel
public ActionResult Index()
{
var objProduct = new ProductViewModel();
objProduct.Items = new[]
{
new SelectListItem { Value = "1", Text = "Domain 1" },
new SelectListItem { Value = "3", Text = "Domain 2" },
new SelectListItem { Value = "3", Text = "Domain 3" }
};
// can replace the above line with loading data from Data access layer.
return View(objProduct);
}
並在您的視圖中強烈鍵入ProductViewModel
@model ProductViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(x => x.SelectedItemId, new SelectList(Model.Items,"Value","Text"), "Select..")
<input type="submit" value="save" />
}
在您的HTTPpost操作中,您將獲得所選的值
[HttpPost]
public ActionResult Index(ProductViewModel model)
{
// check model.SElectedItemId here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.