[英]Validation in MVC C#
我按照本教程进行MVC数据验证: http : //www.tutorialsteacher.com/mvc/implement-validation-in-asp.net-mvc ,不知怎的,这不起作用。 以下是我的代码:
模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace LayoutProject.Models
{
public class Book
{
[Required]
public int bookId { get; set; }
[Required]
public String title { get; set; }
[StringLength(50)]
public String author { get; set; }
[Range(0,4)]
public int publicationYear { get; set; }
public String editor { get; set; }
}
}
局部视图:
@model LayoutProject.Models.Book
<h4>Books</h4>
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(b => b.bookId)
<table>
<tr>
<td>@Html.LabelFor(d=>d.bookId)</td>
<td>@Html.TextBoxFor(d=>d.bookId)
@Html.ValidationMessageFor(b => b.bookId, "", new { @class = "text-danger" })
</td>
</tr>
<tr>
<td>@Html.LabelFor(d=>d.title)</td>
<td>@Html.TextBoxFor(d=>d.title)</td>
</tr>
<tr>
<td>@Html.LabelFor(d=>d.author)</td>
<td>@Html.TextBoxFor(d=>d.author)</td>
</tr>
<tr>
<td>@Html.LabelFor(d=>d.publicationYear)</td>
<td>@Html.TextBoxFor(d=>d.publicationYear)</td>
</tr>
<tr>
<td>@Html.LabelFor(d=>d.editor)</td>
<td>@Html.TextBoxFor(d=>d.editor)</td>
</tr>
</table>
视图:
@{
ViewBag.Title = "CreateBooks";
}
<h2>CreateBooks</h2>
<form action="/Home/SaveBooks" method="post">
@Html.Partial("_CreateBook")
<input id="createBook" type="submit" value="Submit"/>
</form>
正如您所看到的,bookId是必填字段,但是当我单击提交按钮而不输入任何bookId时,我没有收到任何错误消息。 该模型将转到控制器并遵循其中编写的任何方法。 知道我可能错过了什么吗?
控制器:
[HttpPost]
public ActionResult SaveBooks(Book book)
{
return View(book);
}
从我可以收集到的有两种情况:
bookId
中的HiddenFor
并使用它来保存表单回调的ID 要么
TextBoxFor
填充bookId
,而TextBoxFor
没有绑定,因为HiddenFor
首先出现 解:
如果情况是1. - 删除TextBoxFor
, LabelFor
和ValidationFor
bookID
并确保正确填充HiddenFor
(它是int,因此将始终有效)
如果案例是2. - 删除HiddenFor
,你应该没事。
更新:因为它是int
类型,required将始终有效,因为其默认状态为0
如果0永远无效,那么你可以这样做:
在您的模型中:
[PosNumberNoZero(ErrorMessage = "A positive number, bigger than 0 is required")]
public int bookId { get; set; }
//In the same file:
public class PosNumberNoZeroAttribute : ValidationAttribute {
public override bool IsValid(object value) {
if (value == null) {
return true;
}
int getal;
if (int.TryParse(value.ToString(), out getal)) {
if (getal == 0)
return false;
if (getal > 0)
return true;
}
return false;
}
}
更新2:这是未经测试但我认为您可以使用:
[Range(1, int.MaxValue, ErrorMessage = "Please enter a number greater than 0." )]
public int bookId { get; set; }
如果0有效则将1交换为0
您似乎缺少jquery-validation
和jquery.validate.unobtrusive
脚本引用。 尝试在视图(或布局)中添加以下代码:
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/mvc/5.2.3/jquery.validate.unobtrusive.js"></script>
当然,您可以下载它们并将它们作为本地文件引用。
同样小的注意事项 - 在C#中,属性应该在PascalCase
命名(名称应以大写字母开头,每个新单词以大写字母开头)。
[Integer]
[Min(1, ErrorMessage="Please enter Valid bookid.")]
[Required]
public int bookId { get; set; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.