繁体   English   中英

在MVC C#中验证

[英]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);
    }

从我可以收集到的有两种情况:

  1. 你预先填写bookId中的HiddenFor并使用它来保存表单回调的ID

要么

  1. 用户可以使用TextBoxFor填充bookId ,而TextBoxFor没有绑定,因为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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM