Asp.net mvc 4 DropDownListFor选择值的问题

Asp.net mvc 4 DropDownListFor选择值的问题,asp.net-mvc-4,entity-framework-5,Asp.net Mvc 4,Entity Framework 5,我是MVC的新手(好吧,非常新)。我试图创建一个级联下拉列表,在这里我还可以预先选择一个值 我花了一天的大部分时间在这上面,但并没有走得很远。我查看了很多资源,但最有用的是: -我大量使用了它,并让我自己的版本工作,我无法让它工作 -现场一般情况 -这里有一个非常好的例子,遵循视图模型方法,但出于某种原因,它似乎对我不起作用 到目前为止,我得到的是: 型号: using System; using System.Collections.Generic; using Sys

我是MVC的新手(好吧,非常新)。我试图创建一个级联下拉列表,在这里我还可以预先选择一个值

我花了一天的大部分时间在这上面,但并没有走得很远。我查看了很多资源,但最有用的是:

-我大量使用了它,并让我自己的版本工作,我无法让它工作

-现场一般情况

-这里有一个非常好的例子,遵循视图模型方法,但出于某种原因,它似乎对我不起作用

到目前为止,我得到的是:

型号:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;

    namespace BLPrototype.Models
    {
        public class VehicleModels
        {
            public List<vehicle_make> getVehicleMakeList()
            {
                using (var db = new BLEntities())
                {
                    List<vehicle_make> vmk = db.vehicle_make.OrderBy(r => r.vmk_name).ToList();
                    return vmk;
                }
            }

            public List<vehicle_group> getVehicleModelList(string vmk_id)
            {
                using (var db = new BLEntities())
                {
                    List<vehicle_group> vmo = db.vehicle_group.Where(v => v.vg_vmk_id == vmk_id).OrderBy(r => r.vg_name).ToList();

                    return vmo;
                }
            }

        }

        public class vmCatalogue1
        {
            public string Title { get; set; }

            [Display(Name = "Select a make")]
            public IEnumerable<SelectListItem> selectVehicleMake { get; set; }
            [Display(Name = "Select a model")]
            public IEnumerable<SelectListItem> selectVehicleModel { get; set; }

        }

    }
public class VehicleModels
{
    public List<vehicle_make> getVehicleMakeList()
    {
        using (var db = new BLEntities())
        {
            List<vehicle_make> vmk = db.vehicle_make.OrderBy(r => r.vmk_name).ToList();
            return vmk;
        }
    }

    public List<vehicle_group> getVehicleModelList(string vmk_id)
    {
        using (var db = new BLEntities())
        {
            List<vehicle_group> vmo = db.vehicle_group.Where(v => v.vg_vmk_id == vmk_id).OrderBy(r => r.vg_name).ToList();

            return vmo;
        }
    }

}

public class vmCatalogue3
{
    public string Title { get; set; }

    public string selectedMakeId { get; set; }
    public string SelectTopLine { get; set; }

    [Display(Name = "Select a make")]
    public SelectList selectVehicleMake { get; set; }

    [Display(Name = "Select a model")]
    public SelectList selectVehicleModel { get; set; }

}
视图:

@{
布局=空;
}
@模型名称
函数getModels(vmk_id){
$.ajax({
url:“@url.Action(“Models”)”,
数据:{vmk_id:vmk_id},
数据类型:“json”,
类型:“POST”,
错误:函数(){
警报(“发生错误”);
errorHandler(“error1”);
},
成功:功能(数据){
var项目=”;
$。每个(数据、功能(i、项){
项目+=“”+项目。文本+“”;
});
$(“#选择车辆模型”).html(项目);
}
});
}
$(文档).ready(函数(){
$(“#选择车辆制造”)。更改(功能(){
getModels($(“#selectVehicleMake”).val();
});
});
@模型BLPrototype.Models.VMCataloge1
@使用(Html.BeginForm())
{        
@Html.LabelFor(m=>m.selectVehicleMake)
@Html.DropDownListFor(model=>model.selectVehicleMake,model.selectVehicleMake,“请选择”)
@Html.LabelFor(m=>m.selectVehicleModel)
@Html.DropDownListFor(m=>m.selectVehicleModel,Model.selectVehicleModel,new{style=“width:150px”})
}
上面的示例显示了级联下拉列表。我见过很多不同的方法来填充DropDownList for,我想通过视图模型来实现。我真的不知道哪种方法最好。有些示例似乎只显示一个列表,有些示例显示一个selectlistitems列表,而其他示例则显示一个selectlist列表。有没有人能告诉我两者之间的区别,以及“更好”的方法是什么。。。我知道这通常取决于应用程序

我也希望能够预先选择一个Make,如果我愿意的话,我已经看到了一些例子,其中您以各种方式包括ID,还有一些例子是通过将其标记到选择列表的末尾。它们似乎都不起作用

此外,除非选择了品牌,否则模型不应该真正显示。我会通过CSS或其他方法来实现这一点吗

最后,我在make的末尾添加了“Please Select”,如图所示。这似乎不是一个很好的方法。你能给我指一下正确的方向吗

谢谢你抽出时间,我为这么多愚蠢的问题感到抱歉

谢谢


Jay

SelectListItems列表更加明确,并为您提供了一个属性,但它更适合于多选列表,如果您的视图在其他地方需要原始列表,您将无法再访问该列表

看一看。在某些情况下,它可能更适合你。您可以获得这样一个:

myList.ToSelectList("ID", "Description")

加:


在包含“style=…”的同一个对象中,如果在选择某个选项之前需要占位符。

我终于找到了我想要的解决方案。我会把它贴在这里,以防将来有人发现这篇文章有类似的错误

型号:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;

    namespace BLPrototype.Models
    {
        public class VehicleModels
        {
            public List<vehicle_make> getVehicleMakeList()
            {
                using (var db = new BLEntities())
                {
                    List<vehicle_make> vmk = db.vehicle_make.OrderBy(r => r.vmk_name).ToList();
                    return vmk;
                }
            }

            public List<vehicle_group> getVehicleModelList(string vmk_id)
            {
                using (var db = new BLEntities())
                {
                    List<vehicle_group> vmo = db.vehicle_group.Where(v => v.vg_vmk_id == vmk_id).OrderBy(r => r.vg_name).ToList();

                    return vmo;
                }
            }

        }

        public class vmCatalogue1
        {
            public string Title { get; set; }

            [Display(Name = "Select a make")]
            public IEnumerable<SelectListItem> selectVehicleMake { get; set; }
            [Display(Name = "Select a model")]
            public IEnumerable<SelectListItem> selectVehicleModel { get; set; }

        }

    }
public class VehicleModels
{
    public List<vehicle_make> getVehicleMakeList()
    {
        using (var db = new BLEntities())
        {
            List<vehicle_make> vmk = db.vehicle_make.OrderBy(r => r.vmk_name).ToList();
            return vmk;
        }
    }

    public List<vehicle_group> getVehicleModelList(string vmk_id)
    {
        using (var db = new BLEntities())
        {
            List<vehicle_group> vmo = db.vehicle_group.Where(v => v.vg_vmk_id == vmk_id).OrderBy(r => r.vg_name).ToList();

            return vmo;
        }
    }

}

public class vmCatalogue3
{
    public string Title { get; set; }

    public string selectedMakeId { get; set; }
    public string SelectTopLine { get; set; }

    [Display(Name = "Select a make")]
    public SelectList selectVehicleMake { get; set; }

    [Display(Name = "Select a model")]
    public SelectList selectVehicleModel { get; set; }

}
视图:


希望这对别人有帮助

谢谢你的回复。我已经在模型中使用了一个SelectList,除非我遗漏了什么——这很可能!数据占位符很有趣,我在谷歌上快速搜索了一下,在这里找到了一个例子:对于找到这篇文章的任何人。我仍然不确定如何设置所选的值,是否必须为此使用SelectListItems?再次感谢您的回复。您可以在SelectList对象上设置SelectedValue或SelectedValue。有关这些属性的更多信息,请参阅我原始答案中的“SelectList”链接。或者你也可以像在下面接受的答案中那样使用构造函数参数。我喜欢/讨厌学习新东西,这让我想起了我第一次从VB5切换到VB.NET时,花了大约三个小时思考date为什么不起作用(date.now是必需的)。唯一的区别是现在MSDN帮助是无用的。
data-placeholder="Please Select"
public class VehicleModels
{
    public List<vehicle_make> getVehicleMakeList()
    {
        using (var db = new BLEntities())
        {
            List<vehicle_make> vmk = db.vehicle_make.OrderBy(r => r.vmk_name).ToList();
            return vmk;
        }
    }

    public List<vehicle_group> getVehicleModelList(string vmk_id)
    {
        using (var db = new BLEntities())
        {
            List<vehicle_group> vmo = db.vehicle_group.Where(v => v.vg_vmk_id == vmk_id).OrderBy(r => r.vg_name).ToList();

            return vmo;
        }
    }

}

public class vmCatalogue3
{
    public string Title { get; set; }

    public string selectedMakeId { get; set; }
    public string SelectTopLine { get; set; }

    [Display(Name = "Select a make")]
    public SelectList selectVehicleMake { get; set; }

    [Display(Name = "Select a model")]
    public SelectList selectVehicleModel { get; set; }

}
        public ActionResult Index()
    {
        VehicleModels vm = new VehicleModels();
        var model = new vmCatalogue3();

        model.selectedMakeId = "870";
        model.SelectTopLine = "Please Select";

        model.selectVehicleMake = new SelectList(vm.getVehicleMakeList(), "vmk_id", "vmk_name");
        model.selectVehicleModel = new SelectList(vm.getVehicleModelList(""), "vg_id", "vg_name");

        return View(model);            
    }
        @Html.DropDownListFor(m => m.selectedMakeId, Model.selectVehicleMake, Model.SelectTopLine )