【问题标题】:c# MVC Entity Framework - Show only correct child recordsc# MVC Entity Framework - 只显示正确的子记录
【发布时间】:2026-01-01 02:35:02
【问题描述】:

我是 MVC 和实体框架的新手,我正在使用这两种技术构建我的第一个 Web 应用程序。我正在学习一个很棒的教程(首先是数据库),我的基本应用程序现在正在运行。但是有一些教程没有提到。

让我们来看看这个场景: 我有 3 个表:汽车、制造商、型号。

当我转到自动生成的视图来创建一辆新车时,我有正确的下拉菜单来输入制造商和型号。但是模型列表的下拉列表显示了所有模型,而不仅仅是与我选择的制造商相关的模型。

模型

模型

using System;
using System.Collections.Generic;

public partial class model
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public model()
    {
        this.cars = new HashSet<car>();
        this.versions = new HashSet<version>();
    }

    public int id { get; set; }
    public string name { get; set; }
    public Nullable<int> manufacturerId { get; set; }
    public bool active { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<car> cars { get; set; }
    public virtual manufacturer manufacturer { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<version> versions { get; set; }
}

制造商

using System;
using System.Collections.Generic;

public partial class manufacturer
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public manufacturer()
    {
        this.cars = new HashSet<car>();
        this.models = new HashSet<model>();
    }

    public int id { get; set; }
    public string name { get; set; }
    public bool active { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<car> cars { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<model> models { get; set; }
}

汽车

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class car
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public car()
    {
        this.carimages = new HashSet<carimage>();
    }

    public int id { get; set; }
    [Display(Name = "#")]
    public Nullable<int> bodytypeId { get; set; }
    [Display(Name = "Body Type")]
    public Nullable<int> manufacturerId { get; set; }
    [Display(Name = "Model")]
    public Nullable<int> modelId { get; set; }
    [Display(Name = "Version")]
    public Nullable<int> versionId { get; set; }
    [Display(Name = "Fuel")]
    public Nullable<int> fuelId { get; set; }
    [Display(Name = "Transmission")]
    public Nullable<int> transmissionId { get; set; }
    [Display(Name = "Color")]
    public Nullable<int> colorId { get; set; }
    [Display(Name = "HP")]
    public Nullable<int> horsePower { get; set; }
    [Display(Name = "KW")]
    public Nullable<int> kw { get; set; }
    [Display(Name = "CC")]
    public Nullable<int> cc { get; set; }
    [Display(Name = "CO2")]
    public Nullable<double> Co2Emissions { get; set; }
    [Display(Name = "Mileage")]
    public Nullable<int> mileage { get; set; }
    [Display(Name = "Year")]
    public Nullable<int> year { get; set; }
    [Display(Name = "Doors")]
    public Nullable<int> doors { get; set; }
    [Display(Name = "Seats")]
    public Nullable<int> seats { get; set; }
    [Display(Name = "Plate")]
    public string plate { get; set; }
    [Display(Name = "Price")]
    public Nullable<int> price { get; set; }
    [Display(Name = "Short Description")]
    public string shortDescription { get; set; }
    [Display(Name = "Long Description")]
    public string longDescription { get; set; }
    [Display(Name = "Sold")]
    public bool sold { get; set; }
    [Display(Name = "Active")]
    public bool active { get; set; }
    [Display(Name = "Date Added")]
    [DataType(DataType.DateTime)]
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy hh:mm}", ApplyFormatInEditMode = true)]
    public Nullable<System.DateTime> dateAdded { get; set; }
    [Display(Name = "Date Sold")]
    [DataType(DataType.DateTime)]
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy hh:mm}", ApplyFormatInEditMode = true)]
    public Nullable<System.DateTime> dateSold { get; set; }

    public virtual bodytype bodytype { get; set; }
    public virtual color color { get; set; }
    public virtual fuel fuel { get; set; }
    public virtual manufacturer manufacturer { get; set; }
    public virtual model model { get; set; }
    public virtual transmission transmission { get; set; }
    public virtual version version { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<carimage> carimages { get; set; }
}

控制器

汽车

    // GET: cars/Create
    public ActionResult Create()
    {
        ViewBag.bodytypeId = new SelectList(db.bodytypes, "id", "name");
        ViewBag.colorId = new SelectList(db.colors, "id", "name");
        ViewBag.fuelId = new SelectList(db.fuels, "id", "name");
        ViewBag.manufacturerId = new SelectList(db.manufacturers, "id", "name");
        ViewBag.modelId = new SelectList(db.models, "id", "name");
        ViewBag.transmissionId = new SelectList(db.transmissions, "id", "name");
        ViewBag.versionId = new SelectList(db.versions, "id", "name");
        return View();
    }

    // POST: cars/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "id,bodytypeId,manufacturerId,modelId,versionId,fuelId,transmissionId,colorId,horsePower,kw,cc,Co2Emissions,mileage,year,doors,seats,plate,price,shortDescription,longDescription,sold,active,dateAdded,dateSold")] car car)
    {
        if (ModelState.IsValid)
        {
            db.cars.Add(car);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.bodytypeId = new SelectList(db.bodytypes, "id", "name", car.bodytypeId);
        ViewBag.colorId = new SelectList(db.colors, "id", "name", car.colorId);
        ViewBag.fuelId = new SelectList(db.fuels, "id", "name", car.fuelId);
        ViewBag.manufacturerId = new SelectList(db.manufacturers, "id", "name", car.manufacturerId);
        ViewBag.modelId = new SelectList(db.models, "id", "name", car.modelId);
        ViewBag.transmissionId = new SelectList(db.transmissions, "id", "name", car.transmissionId);
        ViewBag.versionId = new SelectList(db.versions, "id", "name", car.versionId);
        return View(car);
    }

查看

创建汽车

@Html.AntiForgeryToken()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>

【问题讨论】:

  • 你想要的是一个级联的DropDownList。看到这个tutorial
  • 在同一主题中进行大量搜索后,找到了解决方案。试试THIS

标签: c# asp.net-mvc entity-framework


【解决方案1】:

问题出在这一行的控制器中:

 ViewBag.modelId = new SelectList(db.models, "id", "name");

这会从数据库中加载所有可用模型作为选项。我想你现在还不知道制造商。 (否则,您可以在此处添加一个简单的 where 子句:db.models.Where(mdl =&gt; mdl.manufacturer == knownManufacturer))。

在客户端过滤选项的一种解决方案是将制造商作为附加的 html 属性添加到模型的 &lt;option&gt; 标记中。 adding html class tag under option in html dropdownlist

然后使用 javascript 监听制造商下拉列表的变化并隐藏所有与所选制造商不匹配的选项。

【讨论】:

  • 我想为每个选项添加一个类属性。我怎样才能做到这一点?我试过你说的链接,但没有成功。我是 MVC 和实体框架的新手。你能帮帮我吗?
  • 如果您使用链接中的代码,首先将Class 属性添加到ExtendedSelectListItem,然后通过添加"class" 键在ListItemToOption 方法中呈现它:builder.Attributes.Add("class", item.Class); .使用@Html.ExtendedDropDownListFor(m =&gt; m.SelectedOption, availableOptions, attributes, defaultOptionLabel) 渲染下拉菜单并确保availableOptions 的类设置正确。