下载MVC

dot*_*bie 2 c# asp.net asp.net-mvc

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

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

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

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

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

 public IEnumerable<SelectListItem> DomainList { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

internal static List<Domain> FetchAllDomains()
Run Code Online (Sandbox Code Playgroud)

接下来在我的控制器动作中,我有:

var domains = FetchAllDomains().Select(d => d.DomainName);
return new EmailModel() {DomainList = domains };
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.IEnumerable'.存在显式转换(您是否错过了演员?)

Dar*_*rov 9

1)向我的ViewModel添加一个新属性?应该是什么类型?名单?

您需要2个属性才能更精确:a 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
}
Run Code Online (Sandbox Code Playgroud)

然后是一个控制器动作,它将填充此视图模型:

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);
}
Run Code Online (Sandbox Code Playgroud)

最后是强类型视图,您将在其中显示下拉列表:

@model MyViewModel
@Html.DropDownListFor(x => x.SelectedValue, Model.Values)
Run Code Online (Sandbox Code Playgroud)

更新:

根据您更新的问题,您IEnumerable<SelectListItem>在视图模型上有一个属性,您试图为其分配一个IEnumerable<string>显然不可能的类型值.你可以把它转换成这样的IEnumerable<SelectListItem>:

var domains = FetchAllDomains().Select(d => new SelectListItem
{
    Value = d.DomainName,
    Text = d.DomainName
});
return new EmailModel { DomainList = domains };
Run Code Online (Sandbox Code Playgroud)