Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC中的下拉列表_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

C# MVC中的下拉列表

C# MVC中的下拉列表,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,在我的MVC应用程序中,我需要添加一个下拉列表来显示域名列表 我已经有了一个包含多个属性的ViewModel。我不确定这些步骤的顺序: 是否将新属性添加到myViewModel?应该是什么类型的?名单 定义用值填充上述属性的方法 在视图中使用该属性?使用HTML.DropdownFor 我知道我应该在我的问题中加入一些代码,但是现在我很难开始使用这个 编辑: 将以下属性添加到ViewModel: public IEnumerable<SelectListItem> DomainLi

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

我已经有了一个包含多个属性的ViewModel。我不确定这些步骤的顺序:

  • 是否将新属性添加到my
    ViewModel
    ?应该是什么类型的?名单
  • 定义用值填充上述属性的方法
  • 在视图中使用该属性?使用
    HTML.DropdownFor
  • 我知道我应该在我的问题中加入一些代码,但是现在我很难开始使用这个

    编辑: 将以下属性添加到ViewModel:

     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
  • 取决于,通常可以是指DropDownlist值的整数 用于填充元素的列表可以定义为ViewBag中的元素或模型中的其他属性
  • razor语法完全取决于您应该使用的
    @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
    
    }