Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
Validation MVC 3验证-仅在失去焦点或提交后显示错误消息?_Validation_Asp.net Mvc 3_Jquery Validate_Data Annotations - Fatal编程技术网

Validation MVC 3验证-仅在失去焦点或提交后显示错误消息?

Validation MVC 3验证-仅在失去焦点或提交后显示错误消息?,validation,asp.net-mvc-3,jquery-validate,data-annotations,Validation,Asp.net Mvc 3,Jquery Validate,Data Annotations,我已经在我的MVC 3应用程序中使用数据注释(必需、stringlength等)设置了实体,并且MVC页面适当地显示了验证错误消息。但是,在用户有机会输入无效值之前,一旦页面加载到新表单上,就会显示错误消息 几年前,我使用了JQuery验证,只有在用户对某个字段失去关注或试图提交表单后,我才能显示错误消息。事实上,我认为这是默认行为 在MVC 3中使用DataAnnotation是否也可以这样做 编辑:这是HTML <div class="form horizontal floated w

我已经在我的MVC 3应用程序中使用数据注释(必需、stringlength等)设置了实体,并且MVC页面适当地显示了验证错误消息。但是,在用户有机会输入无效值之前,一旦页面加载到新表单上,就会显示错误消息

几年前,我使用了JQuery验证,只有在用户对某个字段失去关注或试图提交表单后,我才能显示错误消息。事实上,我认为这是默认行为

在MVC 3中使用DataAnnotation是否也可以这样做

编辑:这是HTML

<div class="form horizontal floated w50p">
<h3>Billing Information</h3>
@using(Html.BeginForm()){
    <div class="item">
        <div class="label">
            <label>* First Name</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Name)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.Name)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>* Address 1</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Street1)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.Street1)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>Address 2</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Street2)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>Address 3</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Street3)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>City</label></div>
        <div class="value">@Html.TextBoxFor(x => x.City)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.City)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>State/Province/Region</label></div>
        <div class="value">@Html.TextBoxFor(x => x.StateProv)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.StateProv)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>Zip / Postal Code</label></div>
        <div class="value">@Html.TextBoxFor(x => x.PostalCode)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.PostalCode)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>* Contact Phone</label></div>
        <div class="value">@Html.TextBoxFor(x => x.ContactPhone)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.ContactPhone)</div>
    </div>        <input type="submit" value="Submit" />
}

计费信息
@使用(Html.BeginForm()){
*名字
@Html.TextBoxFor(x=>x.Name)
@Html.ValidationMessageFor(x=>x.Name)
*地址1
@Html.TextBoxFor(x=>x.Street1)
@Html.ValidationMessageFor(x=>x.Street1)
地址2
@Html.TextBoxFor(x=>x.Street2)
地址3
@Html.TextBoxFor(x=>x.Street3)
城市
@Html.TextBoxFor(x=>x.City)
@Html.ValidationMessageFor(x=>x.City)
州/省/地区
@Html.TextBoxFor(x=>x.StateProv)
@Html.ValidationMessageFor(x=>x.StateProv)
邮政编码
@Html.TextBoxFor(x=>x.PostalCode)
@Html.ValidationMessageFor(x=>x.PostalCode)
*联络电话
@Html.TextBoxFor(x=>x.ContactPhone)
@Html.ValidationMessageFor(x=>x.ContactPhone)
}

您的意思是启用客户端验证?当然,那很容易。只是:

  • 创建视图模型
  • 装饰它
  • 创建控制器
  • 创建一个视图
  • 包括适当的jquery脚本
  • 因此,让我们继续并遵循这些步骤

    视图模型:

    public class ProductViewModel
    {
        [Required] // <-- you could use any data annotation attributes you like
        public string Name { get; set; }
    }
    
    视图:


    如果您想处理自定义验证属性,您可以这样做,但这可能是一个错误。一旦你面对现实世界的应用程序并意识到使用属性(数据注释)进行声明性验证的弱点,我强烈建议你检查一下。

    默认行为正是你所描述的(只有在字段失去焦点或表单提交后才会出现错误)。因此,您的视图或控制器一定有问题。具体地说,验证程序听起来好像认为用户即使在表单的第一个视图上也在发帖。表单的第一个视图应该是
    GET
    而不是
    POST
    。如果粘贴控制器代码,这可能有助于我们更好地进行诊断。

    我目前正在对GET和POST使用相同的操作。你能举个例子说明验证器是如何混淆的吗?我仔细检查了一下,当页面第一次加载时,RequestType在控制器操作中是一个“get”。然后在表单有效并提交时发送“POST”。我目前正在使用数据注释来装饰我的模型,以便进行客户端/服务器端验证。我没有遇到任何值得一提的问题,但由于我刚刚开始使用MVC应用程序,我对您发现的数据批注与您提到的FluentValidation.NET相比的不足之处很感兴趣。@Jed,让我们举一个非常常见的例子:假设您有一个包含复选框的表单。根据是否选中该复选框,您需要确保模型上的某些其他属性是必需的。如果未选中复选框,则不需要这些属性。使用声明性数据批注属性执行此操作似乎有点难看。@Jed-IValidatableObject是否比DataAnnotation属性更适合该场景?@chief7-您指的是哪种场景?
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new ProductViewModel();
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(ProductViewModel model)
        {
            return View(model);
        }
    }
    
    @model ProductViewModel
    
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
    
    @using (Html.BeginForm())
    {
        @Html.LabelFor(x => x.Name)
        @Html.EditorFor(x => x.Name)
        @Html.ValidationMessageFor(x => x.Name)
        <input type="search" value="OK" />
    }
    
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>