MVC C#中的验证
本文关键字:验证 MVC | 更新日期: 2023-09-27 18:15:24
我遵循本教程进行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);
}
根据我所能收集到的情况,有两种情况:
- 您在
HiddenFor
中预先填充bookId
,然后使用它来保存表单回调的ID
或
- 用户可以使用未绑定的
TextBoxFor
填写bookId
,因为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; }