下载MVC

在我的MVC应用程序中,我需要添加一个显示域名列表的下拉列表。

我已经有一个包含多个属性的ViewModel。 我不确定步骤的顺序应该是什么:

  1. 将新属性添加到我的ViewModel ? 应该是什么类型? 名单?
  2. 定义使用值填充上述属性的方法。
  3. 在视图中使用该属性? 使用HTML.DropdownFor

我知道我应该在我的问题中加入一些代码,但是现在我很难开始这个…

编辑:向ViewModel添加以下属性:

  public IEnumerable DomainList { get; set; } 

并实现了一个返回域列表的方法:

 internal static List 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用于保存所有可用选项,标量属性用于保存选定值

2)定义一个用值填充上述属性的方法。

是。

3)在视图中使用该属性? 使用HTML.DropdownFor?

不,不在视图中。 视图不会调用任何方法。 视图适用于视图模型。 控制器有责任将正确填充的视图模型传递给视图。

例如:

 public class MyViewModel { public string SelectedValue { get; set; } public IEnumerable 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属性,您尝试为其指定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 examList) { model.ExamList = new SelectList(examList, "Id", "ExamName"); } 

在我的示例中,您必须添加标记所有考试的列表。 在View中,您将获得一个考试下拉列表
和视图(预测模型中的每个元素):

 @Html.DropDownListFor(model => model.ExamId, Model.ExamList, "Choose exam") 

一旦你的控制器上的列表将其传递给视图(作为模型或使用ViewBag),然后使用帮助器:

 Html.DropDownList( string name, IEnumerable 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 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) 
  1. 是的,您需要模型中的属性来处理DropDownList的值
  2. 取决于,通常可以是指向DropDownlist的值的Integer。您将用于填充元素的List可以定义为ViewBag中的元素,或模型中的Another Attribute
  3. 剃刀语法完全取决于您尝试实现的目标应该使用@Html.DropDownListFor()引用模型的属性以保证视图是@Html.DropDownListFor()

您处于正确的轨道,ViewModel中有2个属性。 一个用于保存UI中所选项ID的项目列表和其他项目

 public class ProductViewModel { public IEnumerable 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..")  } 

在您的HTTPpost操作中,您将获得所选的值

 [HttpPost] public ActionResult Index(ProductViewModel model) { // check model.SElectedItemId here }