Yazan Rawashdeh
Yazan Rawashdeh

Reputation: 1041

How to use ViewModels in Edit Action without making another request?

I need a specific answer or solution about this particular case , I have EditVehicleViewModel that's passed to Edit Vehicle Controller Action like so

public async Task<ActionResult> Edit(EditVehicleViewModel vehiclViewModel)
{
    if (ModelState.IsValid)
    {

         // I NEED TO MAP THE VIEW_MODEL TO THE MODEL HERE 

        db.Entry(vehicleModel).State = EntityState.Modified;
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    return View(vehiclViewModel);
}

I need to update the Model based on the changes that's been to the ViewModel , without making a request to get the Vehicle that's changed and SaveChanges() on it , while still using this line of code if possible

db.Entry(vehiclViewModel).State = EntityState.Modified;

EDIT Here's my model and ViewModel

ViewModel

public class EditVehicleViewModel
{
    [Required]
    public string LicenceNumber { get; set; }

    public int? Year { get; set; }

    public string Color { get; set; }

    [DataType(DataType.Upload)]
    public HttpPostedFileBase ImageUpload { get; set; }

    public string VINNumber { get; set; }
}

Model

public class Vehicle
{
    public int ID { get; set; }

    [Required]
    public string LicenceNumber { get; set; }

    [Required]
    public Nullable<DateTime> Year { get; set; }

    [Required]
    public string Color { get; set; }

    [DataType(DataType.ImageUrl)]
    public string ImageUrl { get; set; }

    [Required]
    public string VINNumber { get; set; }
 }

Upvotes: 1

Views: 231

Answers (2)

Smita
Smita

Reputation: 61

First you have to install any one of the following package from nuget,

PM> Install-Package TinyMapper

OR

PM> Install-Package AutoMapper

then add in your code, if tinymapper is used

TinyMapper.Bind<Vehicle, EditVehicleViewModel>();
Vehicle vehicleModel = TinyMapper.Map<EditVehicleViewModel>(vehiclViewModel);
db.Entry(vehicleModel).State = EntityState.Modified;

OR

if automapper is used,

Mapper.CreateMap<Vehicle , EditVehicleViewModel>();
Vehicle vehicleModel = Mapper.Map<EditVehicleViewModel>(vehiclViewModel);
db.Entry(vehicleModel).State = EntityState.Modified;

Upvotes: 3

user1752532
user1752532

Reputation:

Sorry if this is not right . I am still not too sure where vehicleModel is

public async Task<ActionResult> Edit(EditVehicleViewModel vehiclViewModel)
{
    if (ModelState.IsValid)
    {
         // I am guessing the VINNumber is the identifier
        Vehicle vModel = db.Vehicle.FirstOrDefault(v => v.VINNumber == vehiclViewModel.VINNumber);

        // Mapping here
        vModel.LicenceNumber = vehiclViewModel.LicenceNumber;
        vModel.Year = vehiclViewModel.Year;
        vModel.Color = vehiclViewModel.Color;
        vModel.VINNumber = vehiclViewModel.VINNumber
        vModel.ImageUrl = vehiclViewModel.ImageUrl;

        db.Entry(vModel).State = vModel.ID == 0 ? EntityState.Added : EntityState.Modified;

        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    return View(vehiclViewModel);
}

I assume this is a post because it is an edit. I might be wrong but it might be an idea to add the vehicle id that was used to identify it on the edit page load in a

@Html.Hidden() 

That can then be used as the identifier when looking for the vehicle that needs to be saved

Upvotes: 1

Related Questions