C# MVC中的下拉列表
在我的MVC应用程序中,我需要添加一个下拉列表来显示域名列表 我已经有了一个包含多个属性的ViewModel。我不确定这些步骤的顺序:C# MVC中的下拉列表,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,在我的MVC应用程序中,我需要添加一个下拉列表来显示域名列表 我已经有了一个包含多个属性的ViewModel。我不确定这些步骤的顺序: 是否将新属性添加到myViewModel?应该是什么类型的?名单 定义用值填充上述属性的方法 在视图中使用该属性?使用HTML.DropdownFor 我知道我应该在我的问题中加入一些代码,但是现在我很难开始使用这个 编辑: 将以下属性添加到ViewModel: public IEnumerable<SelectListItem> DomainLi
ViewModel
?应该是什么类型的?名单HTML.DropdownFor
public IEnumerable<SelectListItem> DomainList { get; set; }
但我得到了以下错误:
无法隐式转换类型
“System.Collections.Generic.IEnumerable”到
'System.Collections.Generic.IEnumerable'。
存在显式转换(是否缺少强制转换?)
控制器上有列表后,将其传递到视图(作为模型或使用ViewBag),然后使用辅助对象:
Html.DropDownList(
string name,
IEnumerable<SelectListItem> selectList,
string optionLabel,
object htmlAttributes)
1) 是否将新属性添加到我的ViewModel?应该是什么类型的?名单
您需要两个更精确的属性:一个IEnumerable
来保存所有可用的选项,一个标量属性来保存选定的值
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
}
最后是显示下拉列表的强类型视图:
@model MyViewModel
@Html.DropDownListFor(x => x.SelectedValue, Model.Values)
更新: 根据您更新的问题,您的视图模型上有一个
IEnumerable
属性,您试图为该属性分配类型为IEnumerable
的值,这显然是不可能的。您可以将其转换为IEnumerable
,如下所示:
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");
}
在您的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 });
}
}
}
DropDownList
@Html。DropDownListFor()
引用模型的一个属性,以确保视图是强类型的您所处的位置正确,ViewModel中有两个属性。一个用于保存项目列表,另一个用于保存UI中选定的项目Id
public class ProductViewModel
{
public IEnumerable<SelectListItem> Items { get; set; }
public string SelectedItemId { get; set; }
//Other Properties
}
在您的视图中,它是ProductViewModel的强类型
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 ProductViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(x => x.SelectedItemId, new SelectList(Model.Items,"Value","Text"), "Select..")
<input type="submit" value="save" />
}
我实现了一个返回域名列表的方法,比如:var domains=FetchAllDomains().Select(d=>d.DomainName);返回新的EmailModel(活动){DomainList=domains};但我得到了错误:无法隐式地将类型“System.Collections.Generic.IEnumerable”转换为“System.Collections.Generic.IEnumerable”。存在显式转换(是否缺少转换?)。注释部分应仅用于注释,因为代码段格式不正确且不可读。确定。更新了原文post@DarinDimitrov你好,darin,你能检查一下这个吗?我正在尝试在我的驱动程序视图中填充一个
驱动程序类型
下拉列表。添加驱动程序时,用户应该能够从该下拉列表中选择驱动程序。我试图实现你的代码。但它给出了一个空引用异常。有什么问题吗?
@Html.DropDownListFor(model => model.ExamId,
Model.ExamList,
"Choose exam")
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)
public class ProductViewModel
{
public IEnumerable<SelectListItem> Items { get; set; }
public string SelectedItemId { get; set; }
//Other Properties
}
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);
}
@model ProductViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(x => x.SelectedItemId, new SelectList(Model.Items,"Value","Text"), "Select..")
<input type="submit" value="save" />
}
[HttpPost]
public ActionResult Index(ProductViewModel model)
{
// check model.SElectedItemId here
}