Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据注释MVC 4位_C#_Regex_Asp.net Mvc_Data Annotations - Fatal编程技术网

C# 数据注释MVC 4位

C# 数据注释MVC 4位,c#,regex,asp.net-mvc,data-annotations,C#,Regex,Asp.net Mvc,Data Annotations,我正在尝试实现一个接受4位数字的字段,或者将其保留为空 [RegularExpression(@"^(\d{4})$", ErrorMessage = "Enter a valid 4 digit Year")] [Display(Name = "Year")] public int Year { get; set; } 当输入4个以上的数字时,将显示错误消息。问题是,当我输入任何不是数字或数字与非数字混合的值时,验证错误消息不会显示 我肯定错过了什么。帮帮我:)沃伦 尝试使用nullable

我正在尝试实现一个接受4位数字的字段,或者将其保留为空

[RegularExpression(@"^(\d{4})$", ErrorMessage = "Enter a valid 4 digit Year")]
[Display(Name = "Year")]
public int Year { get; set; }
当输入4个以上的数字时,将显示错误消息。问题是,当我输入任何不是数字或数字与非数字混合的值时,验证错误消息不会显示

我肯定错过了什么。帮帮我:)沃伦

尝试使用nullableint,这样,若模型中并没有任何内容,它将允许共同发送数据,请参阅下面的代码以了解实现

public class TestModel
{
    [RegularExpression(@"^(\d{4})$", ErrorMessage = "Enter a valid 4 digit Year")]
    [Display(Name = "Year")]
    public int? Year { get; set; }
}
更新: 我对这段代码的工作原理的看法如下

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>TestModel</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Year)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Year)
            @Html.ValidationMessageFor(model => model.Year)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

罪魁祸首是使用@HTML.EditorFor属性int创建元素

<input type="number"/>

输入数值以外的值时,元素将忽略该值,并且不会启动验证


解决方法是使用非数字类型的字段,如@HTML.TextBoxFor

int
更改为
string
。然后将字符串转换为C#中的整数。您不需要担心无法转换的字符串,即来自输入的
“123”、“123a”、“aaa”
,因为使用Regex进行数据验证将解决这个问题。如果输入值与给定的正则表达式模式不匹配,正则表达式将抛出验证错误

由于它不是
[Required]
字段,因此也需要一个空字符串。因此,有效的输入应该是
”、“9999”或“dddd”

小心 不要使用可为空的int,
int?
使用该属性,您将倾向于在
input
字段中使用
type=“number”
属性。在这种情况下,如果用户输入say
“123a”
,则值不能转换为数字(在js中),因此模型绑定将获得
null
值,并且不会触发任何验证错误


当我使用
int?
时,Regex没有按预期工作。

不幸的是,这也不能解决我在请求帮助之前尝试过的问题。我找到了罪魁祸首,并将更新线程的详细信息。我们有相同的查看代码作为示例。要解决这个问题,我必须将@Html.EditorFor(model=>model.Year)更改为@Html.txtBoxFor(model=>model.Year)。
<input type="number"/>