验证消息未显示

Validation messages doesn't shows up

我在 Movie class 中添加了验证,然后我在 MoviesController 中更改了程序流程,并在 .cshtml 中添加了验证消息,但是当我运行 我的应用程序没有显示验证消息。

[HttpPost]
public ActionResult Save(Movie movie)
{
    if (ModelState.IsValid)
    {
        if (movie.Id == 0)
        {
            movie.DateAdded = DateTime.Now;
            _context.Movies.Add(movie);
        }
        else
        {
            var movieInDb = _context.Movies.Single(m => m.Id == movie.Id);

            movieInDb.Name = movie.Name;
            movieInDb.NumberInStock = movie.NumberInStock;
            movieInDb.ReleaseDate = movieInDb.ReleaseDate;
            movieInDb.GenreId = movie.GenreId;

            _context.Entry(movieInDb).State = EntityState.Modified;
            _context.SaveChanges();
            return RedirectToAction("Index", "Movies");
        }
        _context.SaveChanges();
        return RedirectToAction("Index", "Movies");
    }
    var viewModel = new NewMovieViewModel
    {
        Genres = _context.Genres.ToList(),
        Movie = movie
    };

    return RedirectToAction("New", viewModel);
}

这是 MoviesController 中我更改程序流程的方法。

Movie class 和验证

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace Vidly.Models
{
    public class Movie
    {
        public int Id { get; set; }

        [Required]
        [StringLength(255)]
        public string Name { get; set; }

        public Genre Genre { get; set; }

        [Display(Name = "Genre")]
        [Required]
        public byte GenreId { get; set; }

        [Display(Name = "Release date")]
        [Required]
        public DateTime ReleaseDate { get; set; }

        public DateTime DateAdded { get; set; }

        [Display(Name = "Number in stock")]
        [Required]
        [Range(1,20)]
        public int NumberInStock { get; set; }
    }
}

最后 New.cshtml

@model Vidly.VIewModels.NewMovieViewModel
@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@{
    if (Model.Movie != null)
    {
        <h2>Edit Movie</h2>
    }
    else
    {
        <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" })
        @Html.ValidationMessageFor(m => m.Movie.Name)
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Movie.ReleaseDate)
        @Html.TextBoxFor(m => m.Movie.ReleaseDate, "{0:d MMM yyyy}", new { @class = "form-control" })
        @Html.ValidationMessageFor(m=> m.Movie.ReleaseDate)
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Movie.GenreId)
        @Html.DropDownListFor(m => m.Movie.GenreId, new SelectList(Model.Genres, "Id", "Name"), "", new { @class = "form-control" })
        @Html.ValidationMessageFor(m=> m.Movie.GenreId)

    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Movie.NumberInStock)
        @Html.TextBoxFor(m => m.Movie.NumberInStock, new { @class = "form-control" })
        @Html.ValidationMessageFor(m=> m.Movie.NumberInStock)

    </div>

    <button type="submit" class="btn btn-primary">Save</button>

    if(Model.Movie !=null){

        @Html.HiddenFor(m => m.Movie.Id)
    }

    @Html.AntiForgeryToken()
}

New.chtml中调用Html.ValidationSummary(true);方法:

@using (Html.BeginForm("Save", "Home"))
{
    @Html.ValidationSummary(true);
    ...
}

而且我想您应该将 return RedirectToAction("New", viewModel); 替换为 return View("New", viewModel); 以将无效模型数据发送回 New() 操作方法以便能够显示错误消息。

注意: 如果 Html.ValidationSummary(...) 参数为 true,则仅显示模型级错误。如果参数为false,则显示所有错误。