开箱即用的 MVC5 脚手架下拉菜单

MVC5 Scaffolding Dropdowns Out the Box

我想查看、编辑和创建我的查找关系的下拉列表。

有时这行得通,有时行不通。一直是个谜,希望能在这里彻底解开。

这是我用于查找的 POCO

public class Color
{
     public int Id { get; set; }
     public string Value {get;set;}
}

//Red,White,Blue

public class Size
{
     public int Id { get; set; }
     public string Value { get; set; }
}

//S,M,L

这里是主要的对象,我希望它的颜色和大小下拉脚手架开箱即用。

public class Product
{
    public int Id;
    public string Name;
    public virtual Color Color;
    public virtual Size Size;
}

这对我不起作用。在查看、编辑或创建产品时,尺寸或颜色均未显示。我只看到名称字段。

默认情况下尺寸和颜色是延迟加载的(虚拟的)所以你需要提前加载它们:

var products = context.Products.Include(p => p.Color).Include(p => p.Size).ToList();

https://msdn.microsoft.com/en-us/data/jj574232.aspx

如果您的问题与下拉菜单有关,您需要在包含列表项的控制器中构建一个视图模型,将其发送到您的视图并使用 DropDownListFor(m => m.ColorId, m.Colors).您可能需要将 ColorId 和 SizeId 添加到您的 Product 模型中。这里有一个很好的解释:http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx

改成这样:

public class Color
{
    public int Id { get; set; }
    public string Value {get;set;}
    public ICollection<Product> Products {get;set;}
}

//Red,White,Blue

public class Size
{
     public int Id { get; set; }
     public string Value { get; set; }
     public ICollection<Product> Products {get;set;}
}

你的主要对象:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    [ForeignKey("Color")]
    public int Color_Id { get; set; }
    public virtual Color Color { get; set; }

    [ForeignKey("Size")]
    public int Size_Id { get; set; }
    public virtual Size Size { get; set; }
}

然后,只需添加一个带有创建或编辑模板的脚手架视图,VS 就会像这样生成 DDL:

 <div class="form-group">
            @Html.LabelFor(model => model.Color_Id, "Color_Id", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("Color_Id", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Color_Id, "", new { @class = "text-danger" })
            </div>
 </div>