我按照本教程进行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
要么
用户可以使用不受约束的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
关于c# - 在MVC C#中进行验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32887776/