2016-03-23 45 views
-1

我是新來的MVC和實體框架,我正在用這兩種技術構建我的第一個Web應用程序。我正在遵循一個很好的教程(數據庫優先),現在我有了我的基本應用程序。但是有一些教程沒有提到。c#MVC實體框架 - 只顯示正確的子記錄

讓我們採取這種情況: 我有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); 
    } 

VIEW

創建汽車

@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> 
+0

你想要的是一個級聯的DropDownList。看到這個[教程](http://www.c-sharpcorner.com/UploadFile/raj1979/dropdown-cascading-in-mvc4-using-entity-framework/) – DCruz22

+0

經過大量的搜索在同一主題後,發現一個解。試試[這](http://stackoverflow.com/questions/36198809/dropdownlist-with-foreach-loop-in-c-sharp-mvc) –

回答

0

的問題是在這條線的控制器:

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

這會將所有可用的型號從數據庫中作爲選項。我想你現在還不知道製造商。 (否則你可以在這裏添加一個簡單的where子句:db.models.Where(mdl => mdl.manufacturer == knownManufacturer))。

過濾客戶端選項的解決方案是將製造商作爲附加html屬性添加到模型的<option>標籤。 adding html class tag under option in html dropdownlist

然後使用JavaScript聽製造商下拉列表的變化,並隱藏與選定製造商不匹配的所有選項。

+0

我想爲每個選項添加一個類屬性。我怎樣才能做到這一點?我嘗試了你說的鏈接,但不成功。我是MVC和Entity Framework的新手。你能幫我嗎? – Hahn86

+0

如果使用鏈接中的代碼,首先將'Class'屬性添加到'ExtendedSelectListItem',然後通過添加''class''鍵將其呈現在'ListItemToOption'方法中:'builder.Attributes.Add(「 class「,item.Class);'。使用'@ Html.ExtendedDropDownListFor(m => m.SelectedOption,availableOptions,attributes,defaultOptionLabel)'渲染下拉列表,並確保'availableOptions'的類已正確設置。 –