我按照本教程进行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。-删除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

关于c# - 在MVC C#中进行验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32887776/

10-10 19:50