验证消息未显示
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
,则显示所有错误。
我在 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
,则显示所有错误。