I am using codefirst approach and entity framework to update my Customer by changing the name but EnityValidation Error occurs.As I try to debug it using trycatch block it shows the name field is required.
I used data annotation while using entity framework to my model class.
public class Customer
{
public int Id { get; set; }
[Required]
[StringLength(255)]
public string Name { get; set; }
[Display(Name ="Date Of Birth")]
[DisplayFormat(ApplyFormatInEditMode =true,DataFormatString ="{0:dd/MM/yyyy}")]
public DateTime? Birthdate { get; set; }
public bool IsSubscribedToNewsletter { get; set; }
public MembershipType MembershipType { get; set; }
[Display(Name ="MembershipType")]
public byte MembershipTypeId { get; set; }
}
[Action-Save in CustomersController]
[HttpPost]
public ActionResult Save(Customer customer)
{
if (customer.Id == 0)
_context.Customers.Add(customer);
else
{
var customerInDb = _context.Customers.Single(c => c.Id == customer.Id);
customerInDb.Name = customer.Name;
customerInDb.Birthdate = customer.Birthdate;
customerInDb.IsSubscribedToNewsletter = customer.IsSubscribedToNewsletter;
customerInDb.MembershipTypeId = customer.MembershipTypeId;
}
try
{
_context.SaveChanges();
}
catch (DbEntityValidationException e)
{
Console.WriteLine(e);
}
return RedirectToAction("Index", "Customers");
}
[Edit-Action in CustomerController]
public ActionResult Edit(int id)
{
var customer = _context.Customers.SingleOrDefault(c => c.Id == id);
if (customer == null)
{
return HttpNotFound();
}
var viewModel = new CustomerFormViewModel
{
Customers = customer,
MembershipTypes = _context.MembershipType.ToList()
};
return View("CustomerForm", viewModel);
}
[New-Action CustomerController]
public ActionResult New()
{
var membershipType = _context.MembershipType.ToList();
var viewModel = new CustomerFormViewModel
{
MembershipTypes = membershipType
};
return View("CustomerForm", viewModel);
}
[CustomerFormViewModel -CustomerController]
public class CustomerFormViewModel
{
public IEnumerable<MembershipType> MembershipTypes { get; set; }
public Customer Customers { get; set; }
}
View-CustomerForm
@using (Html.BeginForm("Save","Customers"))
{
<div class="form-group">
@Html.LabelFor(c => c.Customers.Name)
@Html.TextBoxFor(c => c.Customers.Name,new{ @class="form-control"})
</div>
<div class="form-group">
@Html.LabelFor(c => c.Customers.Birthdate)
@Html.TextBoxFor(c => c.Customers.Birthdate,"{0:d MMM yyyy}" ,new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(c => c.Customers.MembershipTypeId)
@Html.DropDownListFor(c => c.Customers.MembershipTypeId,new SelectList(Model.MembershipTypes,"Id","Name"),"Select MembershipType",new { @class = "form-control" })
</div>
<div class="form-check">
<label>
@Html.CheckBoxFor(c => c.Customers.IsSubscribedToNewsletter) Subscribed To NewsLetter?
</label>
</div>
@Html.HiddenFor(c => c.Customers.Id)
<button type="submit" class="btn btn-primary">Save</button>
But this code works for another parameter "Movies".The movie object get passed.
[movies-model]
public class Movie
{
public int Id { get; set; }
public string Name { get; set; }
public Genre Genre { get; set; }
public byte GenreId { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/mm/yyyy}")]
public DateTime ReleaseDate { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/mm/yyyy}")]
public DateTime DateAdded { get; set; }
public byte NumberInStock { get; set; }
}
[Edit-Action MovieController]
public ActionResult Edit(int id)
{
var movie = _context.Movies.SingleOrDefault(m => m.Id == id);
if (movie == null)
{
return HttpNotFound();
}
var viewModel = new MovieFormViewModel
{
Movie = movie,
Genres = _context.Genre.ToList()
};
return View("MovieForm",viewModel);
}
[New-Action MovieController]
public ActionResult New()
{
var genre = _context.Genre.ToList();
var viewModel = new MovieFormViewModel()
{
Genres = genre
};
return View("MovieForm", viewModel);
}
[Save-Action MovieController]
[HttpPost]
public ActionResult Save(Movie movie)
{
if(movie.Id==0)
{
movie.DateAdded = DateTime.Now;
_context.Movies.Add(movie);
}
else
{
var movieInDb = _context.Movies.SingleOrDefault(m => m.Id == movie.Id);
movieInDb.Name = movie.Name;
movieInDb.NumberInStock = movie.NumberInStock;
movieInDb.GenreId = movie.GenreId;
movieInDb.ReleaseDate = movie.ReleaseDate;
}
_context.SaveChanges();
return RedirectToAction("Index","Movies");
}
[MovieFormviewModel]
public class MovieFormViewModel
{
public Movie Movie { get; set; }
public IEnumerable<Genre> Genres { get; set; }
public string Title
{
get
{
if(Movie != null && Movie.Id !=0)
{
return "Edit Movie";
}
else
{
return "New Movie";
}
}
}
}
[movieForm-View]
@model Vidly.ViewModels.MovieFormViewModel
@{
ViewBag.Title = Model.Title;
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>New Movie</h2>
@using (Html.BeginForm("Save", "Movies"))
{
<div class="form-group">
@Html.LabelFor(m => m.Movie.Name)
@Html.TextBoxFor(m => m.Movie.Name,new { @class="form-control" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Movie.ReleaseDate)
@Html.TextBoxFor(m => m.Movie.ReleaseDate, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Movie.GenreId)
@Html.DropDownListFor(m => m.Movie.GenreId,new SelectList(Model.Genres,"Id","Name"),"Select Genre", new { @class = "form-control"})
</div>
<div class="form-group">
@Html.LabelFor(m => m.Movie.NumberInStock)
@Html.TextBoxFor(m => m.Movie.NumberInStock, new { @class = "form-control" })
</div>
@Html.HiddenFor(m => m.Movie.Id)
<button type="submit" class="btn btn-primary">Save</button>
}
**How can i remove this error?Why is the object not getting passed for customers but for movies!!Both are basically same! **