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);
    }

MVC C#中的验证

根据我所能收集到的情况,有两种情况:

  1. 您在HiddenFor中预先填充bookId,然后使用它来保存表单回调的ID

  1. 用户可以使用未绑定的TextBoxFor填写bookId,因为HiddenFor最先出现

解决方案:

如果情况是1删除TextBoxForLabelForValidationFor 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-validationjquery.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; }