diff --git a/Vidly/Controllers/CustomersController.cs b/Vidly/Controllers/CustomersController.cs index 2496739..a9efc2d 100644 --- a/Vidly/Controllers/CustomersController.cs +++ b/Vidly/Controllers/CustomersController.cs @@ -41,6 +41,7 @@ namespace Vidly.Controllers } [HttpPost] + [ValidateAntiForgeryToken] public ActionResult Save(Customer customer) { if (!ModelState.IsValid) diff --git a/Vidly/Controllers/MoviesController.cs b/Vidly/Controllers/MoviesController.cs index 2b75e92..91405b5 100644 --- a/Vidly/Controllers/MoviesController.cs +++ b/Vidly/Controllers/MoviesController.cs @@ -28,15 +28,25 @@ namespace Vidly.Controllers var movieGenres = _context.MovieGenres.ToList(); var viewModel = new MovieFormViewModel { - Movie = new Movie(), + //Movie = new Movie(), MovieGenres = movieGenres }; return View("MovieForm", viewModel); } [HttpPost] + [ValidateAntiForgeryToken] public ActionResult Save(Movie movie) { + if (!ModelState.IsValid) + { + var viewModel = new MovieFormViewModel(movie) + { + MovieGenres = _context.MovieGenres.ToList() + }; + return View("MovieForm", viewModel); + } + if (movie.Id == 0) _context.Movies.Add(movie); else @@ -83,9 +93,8 @@ namespace Vidly.Controllers if (movie == null) return HttpNotFound(); - var viewModel = new MovieFormViewModel + var viewModel = new MovieFormViewModel(movie) { - Movie = movie, MovieGenres = _context.MovieGenres.ToList() }; diff --git a/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.Designer.cs b/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.Designer.cs new file mode 100644 index 0000000..7d84697 --- /dev/null +++ b/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Vidly.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddRequiredMarksOnMovieFields : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddRequiredMarksOnMovieFields)); + + string IMigrationMetadata.Id + { + get { return "201901232137372_AddRequiredMarksOnMovieFields"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.cs b/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.cs new file mode 100644 index 0000000..b604698 --- /dev/null +++ b/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.cs @@ -0,0 +1,18 @@ +namespace Vidly.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class AddRequiredMarksOnMovieFields : DbMigration + { + public override void Up() + { + AlterColumn("dbo.Movies", "ReleaseDate", c => c.DateTime(nullable: false)); + } + + public override void Down() + { + AlterColumn("dbo.Movies", "ReleaseDate", c => c.DateTime()); + } + } +} diff --git a/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.resx b/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.resx new file mode 100644 index 0000000..f58d75e --- /dev/null +++ b/Vidly/Migrations/201901232137372_AddRequiredMarksOnMovieFields.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Vidly/Models/Movie.cs b/Vidly/Models/Movie.cs index c08b11b..6e720d9 100644 --- a/Vidly/Models/Movie.cs +++ b/Vidly/Models/Movie.cs @@ -14,11 +14,14 @@ namespace Vidly.Models [StringLength(255)] public string Name { get; set; } + [Required] [Display(Name="Release Date")] public DateTime? ReleaseDate { get; set; } public DateTime? DateAdded { get; set; } + [Required] + [Range(1,20)] [Display(Name = "Number In Stock")] public int NumberInStock { get; set; } diff --git a/Vidly/Vidly.csproj b/Vidly/Vidly.csproj index cb5cf07..13b4c59 100644 --- a/Vidly/Vidly.csproj +++ b/Vidly/Vidly.csproj @@ -241,6 +241,10 @@ 201901222227126_AddedNullableAddedDateToMovie.cs + + + 201901232137372_AddRequiredMarksOnMovieFields.cs + @@ -388,6 +392,9 @@ 201901222227126_AddedNullableAddedDateToMovie.cs + + 201901232137372_AddRequiredMarksOnMovieFields.cs + 10.0 diff --git a/Vidly/ViewModels/MovieFormViewModel.cs b/Vidly/ViewModels/MovieFormViewModel.cs index a953b61..2f623a3 100644 --- a/Vidly/ViewModels/MovieFormViewModel.cs +++ b/Vidly/ViewModels/MovieFormViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; using Vidly.Models; @@ -9,6 +10,44 @@ namespace Vidly.ViewModels public class MovieFormViewModel { public IEnumerable MovieGenres { get; set; } - public Movie Movie { get; set; } + public int? Id { get; set; } + + [Required] + [StringLength(255)] + public string Name { get; set; } + + [Required] + [Display(Name = "Release Date")] + public DateTime? ReleaseDate { get; set; } + + [Required] + [Range(1, 20)] + [Display(Name = "Number In Stock")] + public int? NumberInStock { get; set; } + + [Display(Name = "Genre")] + [Required] + public byte? MovieGenreId { get; set; } + + public string Title + { + get + { + return (Id != 0) ? "Edit Movie":"New Movie"; + } + } + + public MovieFormViewModel() + { + Id = 0; + } + public MovieFormViewModel(Movie movie) + { + Id = movie.Id; + Name = movie.Name; + ReleaseDate = movie.ReleaseDate; + NumberInStock = movie.NumberInStock; + MovieGenreId = movie.MovieGenreId; + } } } \ No newline at end of file diff --git a/Vidly/Views/Customers/CustomerForm.cshtml b/Vidly/Views/Customers/CustomerForm.cshtml index 3765a25..8ab0555 100644 --- a/Vidly/Views/Customers/CustomerForm.cshtml +++ b/Vidly/Views/Customers/CustomerForm.cshtml @@ -17,7 +17,7 @@ else @using (@Html.BeginForm("Save", "Customers")) { - @Html.ValidationSummary(true, "Please fix the following errors.") + @Html.ValidationSummary(true, "Var snäll och åtgärda felen.")
@Html.LabelFor(m => m.Customer.Name) @Html.TextBoxFor(m => m.Customer.Name, new { @class = "form-control" }) @@ -39,6 +39,12 @@ else
@Html.HiddenFor(m => m.Customer.Id) + @Html.AntiForgeryToken(); } + +@section scripts +{ + @Scripts.Render("~/bundles/jqueryval") +} diff --git a/Vidly/Views/Movies/MovieForm.cshtml b/Vidly/Views/Movies/MovieForm.cshtml index 4af3107..67ed994 100644 --- a/Vidly/Views/Movies/MovieForm.cshtml +++ b/Vidly/Views/Movies/MovieForm.cshtml @@ -5,33 +5,39 @@ } -@if (Model.Movie.Id == null || Model.Movie.Id == 0) -{ -

New Movie

-} -else -{ -

Edit Movie

-} +

@Model.Title

+ @using (Html.BeginForm("Save", "Movies")) { + @Html.ValidationSummary(true, "Var snäll och åtgärda felen.")
- @Html.LabelFor(m => m.Movie.Name) - @Html.TextBoxFor(m => m.Movie.Name, new { @class = "form-control" }) + @Html.LabelFor(m => m.Name) + @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) + @Html.ValidationMessageFor(m => m.Name)
- @Html.LabelFor(m => m.Movie.ReleaseDate) - @Html.TextBoxFor(m => m.Movie.ReleaseDate, "{0:d MMM yyyy}", new { @class = "form-control" }) + @Html.LabelFor(m => m.ReleaseDate) + @Html.TextBoxFor(m => m.ReleaseDate, "{0:d MMM yyyy}", new { @class = "form-control" }) + @Html.ValidationMessageFor(m => m.ReleaseDate)
- @Html.LabelFor(m => m.Movie.MovieGenreId) - @Html.DropDownListFor(m => m.Movie.MovieGenreId, new SelectList(Model.MovieGenres, "Id", "Name"), "Select Genre Type", new { @class = "form-control" }) + @Html.LabelFor(m => m.MovieGenreId) + @Html.DropDownListFor(m => m.MovieGenreId, new SelectList(Model.MovieGenres, "Id", "Name"), "Select Genre Type", new { @class = "form-control" }) + @Html.ValidationMessageFor(m => m.MovieGenreId) +
- @Html.LabelFor(m => m.Movie.NumberInStock) - @Html.TextBoxFor(m => m.Movie.NumberInStock, new { @class = "form-control" }) + @Html.LabelFor(m => m.NumberInStock) + @Html.TextBoxFor(m => m.NumberInStock, new { @class = "form-control" }) + @Html.ValidationMessageFor(m => m.NumberInStock)
-@Html.HiddenFor(m=>m.Movie.Id) + @Html.HiddenFor(m => m.Id) + @Html.AntiForgeryToken(); -} \ No newline at end of file +} + +@section scripts +{ + @Scripts.Render("~/bundles/jqueryval") +}