Jaan
Jaan

Reputation: 3393

ASP.NET MVC 4 Error Saving ViewModels

Can somebody help me on how to save and update data into multiple entities using a ViewModel?

I have a ViewModel that looks like this:

  public class StudentViewModel
  {
    public Student student;
    public StudentAddress studentAddress { get; set; }
    public StudentPhoto studentPhoto { get; set; }
    // Three entities are related to one to one relationship

    public StudentViewModel()
    { }

    }

My Controller is:

  [HttpPost]
    public ActionResult Create(StudentViewModel studentViewModel)
    {
        if (ModelState.IsValid)
        {
            return View(studentViewModel);
        }

            Student s = new Student()
             {
                 Name =studentViewModel.Student.Name,
                 Speciality = studentViewModel.Student.Speciality,
                 DateOfReg = studentViewModel.Student.DateOfJoinig,
                 Qualification = studentViewModel.Student.Qualification,
                 Email = studentViewModel.Student.Email

             };

            StudentAddress sa = new StudentAddress()
            {
                StudentId= studentViewModel.Student.StudentId,
                Address = studentViewModel.StudentAddress.Address,
                Area = studentViewModell.StudentAddress.Area,
                City = studentViewModel.StudentAddress.City,
                State = studentViewModel.StudentAddress.State,
                Mobile = studentViewModel.StudentAddress.Mobile

            };

            StudentPhoto sp = new StudentPhoto()
            {
                StudentId= studentViewModel.Student.StudentId,
                Photo = studentViewModel.StudentPhoto.Photo

            };    
            db.Students.Add(s);
            db.StudentAddress.Add(sa);
            db.StudentPhoto.Add(sp);

            db.SaveChanges();
            return RedirectToAction("Home");
    }

View is:

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Doctor</legend>


    @Html.EditorFor(model => model.Student.Name )
    @Html.EditorFor(model => model.Student.Speciality)
    @Html.EditorFor(model => model.Student.DateOfJoinig)
    @Html.EditorFor(model => model.Student.Standard)

    @Html.HiddenFor(model => model.Student.StudentId)
    @Html.EditorFor(model => model.StudentAddress.Address)
    @Html.EditorFor(model => model.StudentAddress.Area)
    @Html.EditorFor(model => model.StudentAddress.City)
    @Html.EditorFor(model => model.StudentAddress.State)

    @Html.HiddenFor(model => model.Student.StudentId)
    @Html.EditorFor(model => model.StudentPhoto.Photo)

     <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    }

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

I was able to retrieve and display the data (from multiple entities) into the view. However, now I'm stuck on how can I save and update the above entities with the new data. Most of the examples are 1-1 relationship the mapping is automatic, but in this case the data belongs to multiple entities.

My problem is when i try to save data it redirected to the create page. "ModelState.IsValid" is false always so no data saved. Please help me how do i proceed.

Thanks.

Upvotes: 0

Views: 215

Answers (3)

Amila
Amila

Reputation: 3816

The problem with your implementation is that your view model contains a several models(Entities). This is not a good implementation.

Try to create a viewmodel which just contains the fields (flattened version) that you want to be edited by the user when creating a student. Use Data Annotations in your view model like Required or StringLength to validate user inputs.

Upvotes: 0

goldieJ
goldieJ

Reputation: 105

In Controller you check if(modelstate.isvalid) - if is valid you returned view without saving data from view.

Upvotes: 0

haim770
haim770

Reputation: 49095

This line at the top of your Action is wrong:

if (ModelState.IsValid)
    {
    return View(studentViewModel);
    }

It should be the opposite, only if the Model is NOT valid, then you should stop the process and re-render the View with the form.

Try:

if (!ModelState.IsValid)
    {
    return View(studentViewModel);
    }

Upvotes: 2

Related Questions