简体   繁体   中英

MVC client-side validation for multiple models

I have three models: VehicleType , VehicleModel , and VehicleManufacturer .

Both VehicleType and VehicleManufacturer point to VehicleModel in the model, like so:

public class VehicleModel
{
    [Key]
    public int ModelId { get; set; }

    [Required(ErrorMessage = "Field is Required")]
    public int TypeId { get; set; }

    [Required(ErrorMessage = "Field is Required")]
    public int ManufacturerId { get; set; }
    public string ModelName { get; set; }


    public VehicleType VehicleType { get; set; }
    public VehicleManufacturer Manufacturer { get; set; }

}

From there, VehicleModel points to the InventoryModel:

 public class Inventory
{
    [Key]
    public int InventoryId { get; set; }
    public int Price { get; set; }
    public int Mileage { get; set; }
    public int Year { get; set; }


    public int ModelId { get; set; }
    public VehicleModel VehicleModel { get; set; }
}

My problem is when I try to get client-side validation working on all three dropdownlists ( VehicleType , VehicleManufacturer , VehicleModel ), it only works with VehicleModel .

What needs to be done to validate these two dropdownlists using these models?

Here is my controller (fyi):

 // GET: /Inventory/Create
    public ActionResult Create()
    {
        ViewBag.TypeId = new SelectList(db.Types, "TypeId", "TypeName"); //(Object List, Value Field (usually Id), Column)
        ViewBag.ModelId = new SelectList(db.Models, "ModelId", "ModelName"); //(Object List, Value Field (usually Id), Column)
        ViewBag.ManufacturerId = new SelectList(db.Manufacturers, "ManufacturerId", "ManufacturerName"); //(Object List, Value Field (usually Id), Column)

        return View();
    }

    // POST: /Inventory/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(Inventory inventory, VehicleManufacturer VehicleManufacturer, VehicleType VehicleType)
    {
        if (ModelState.IsValid)
        {
            db.Inventorys.Add(inventory);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.TypeId = new SelectList(db.Types, "TypeId", "TypeName");
        ViewBag.ModelId = new SelectList(db.Models, "ModelId", "ModelName");
        ViewBag.ManufacturerId = new SelectList(db.Manufacturers, "ManufacturerId",     "ManufacturerName");

        return View(inventory);
    }

View:

 <div class="editor-label">
        @Html.LabelFor(model => model.VehicleModel.TypeId, "Some name for column")
    </div>
    <div class="editor-field">
        @Html.DropDownList("TypeId", String.Empty)

        @Html.ValidationMessageFor(model => model.VehicleModel.TypeId)
    </div>


    <div class="editor-label">
        @Html.LabelFor(model => model.ModelId, "Some name for column")
    </div>
    <div class="editor-field">
        @Html.DropDownList("ModelId", String.Empty)
        @Html.ValidationMessageFor(model => model.ModelId)
    </div>



    <div class="editor-label">
        @Html.LabelFor(model => model.VehicleModel.ManufacturerId, "Some name for column")
    </div>
    <div class="editor-field">
        @Html.DropDownList("ManufacturerId", String.Empty)
        @Html.ValidationMessageFor(model => model.VehicleModel.ManufacturerId)
    </div>

Please someone help. I've been on this for many, many hours!

There are actually two problems That I see above

1) That you're not mapping the DropDownList and the ValidationMessageFor to the same model attribute.

@Html.ValidationMessageFor(model => model.VehicleModel.ManufacturerId)

The above is binding it to VehicleModel_ManufacturerId where as:

@Html.DropDownList("ManufacturerId", String.Empty)

the above is mapping the DropDown to just ManufacturerId

You need to change one or the other to match each other.

2) In the above code, I don't see any Validation Attributes. did you forgot them when you copied the code over here?

Hope this helps, Let me know if you needed more details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM