简体   繁体   English

ASP.NET MVC中的表单验证(使用javascript)

[英]form validation in asp.net mvc ( using javascript )

i'm new to asp.net mvc and i have aform with some validation and i want to validate it in client side so i write normal script in javascript to be more specefic my problem was the return false ( as it shouldn't send any data to server and still in apage but this doesn't happen) ,note : i test the script in normal html file with js and works fine but as i said i'm not familiar with mvc so i want to know if there any thing i have missed to work in it and if there any reference to any toturial in this specefic point it would be good , as i noticed in this place ( there's no place for beginners :); 我是asp.net mvc的新手,我已经进行了某种形式的验证,并且我想在客户端进行验证,因此我在javascript中编写了普通脚本,更加具体地讲,我的问题是返回false(因为它不应该发送任何内容数据到服务器,仍然在页面中,但不会发生),请注意:我用js在普通的html文件中测试了脚本,并且工作正常,但是正如我所说的,我对mvc不熟悉,所以我想知道是否有任何事情我错过了工作,如果我在这个地方注意到(在这个地方没有任何关于折腾的提法的话)会是一件好事(对于初学者来说没有地方了:); this is a snippet of my code too 这也是我的代码的一小段

@model registerationex.Models.register

@{
    ViewBag.Title = "Create";
}


<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(false)

    <fieldset>
        <legend>register</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.name)
        </div>

        <div class="editor-field">
            @Html.EditorFor(model => model.name)
            <span id="error"></span>
            @Html.ValidationMessageFor(model => model.name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.email)
        </div>

        <div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-required="The email field is required." id="email" name="email" type="text" value="" onblur="checkuser(email);">      
                  <span id="erroruser"></span>
            @Html.ValidationMessageFor(model => model.email)
        </div>

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

        <p>
            <input type="submit" value="Create" onclick="allvalidate();"  />
        </p>
    </fieldset>
}

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



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

}

<script>
    function allvalidate() {
        var validated = true;
        if (!validate()) validated = false;
        if (!checkAge(age)) validated = false;
        if (!checkuser(email)) validated = false;

        return validated;
    }


    function validate() {
        var txtf = document.getElementById('name');
        if (txtf.value == 0 || txtf.value == null) {
            document.getElementById('error').innerText = ('you must enter firstname');
            document.getElementById('error').style.color = 'red';

            txtf.focus();
            return false;
        }
        else {
            document.getElementById('error').innerText = ('');
            return true;
        }
    }


    function checkAge(input) {
        if (input.value < 18 || input.value > 70) {
            document.getElementById('errorage').innerText = ('age must be from 18 :70');
            document.getElementById('errorage').style.color = 'red';
            return false;
        }
        else {
            document.getElementById('errorage').innerText = ('');
            return true;
        }

    }


    function checkuser(input) {
        var pattern = '^[a-zA-Z]+$';
        if (input.value.match(pattern)) {
            document.getElementById('erroruser').innerText = '';
            return true;
        }
        else {
            document.getElementById('erroruser').innerText = ('enter valid email');
            document.getElementById('erroruser').style.color = 'red';

            return false;
        }


    }



</script>

You have included @Scripts.Render("~/bundles/jqueryval") which by default jquery.validate.unobtrusive.js , so delete all your scripts and make use of the features which come with MVC. 您已包含@Scripts.Render("~/bundles/jqueryval") ,默认情况下为jquery.validate.unobtrusive.js ,因此请删除所有脚本并使用MVC随附的功能。 Simply add the validation attributes to your properties. 只需将验证属性添加到您的属性。

[Required(ErrorMessage = "you must enter firstname")]
public string name { get; set; }

[EmailAddress(ErrorMessage = "enter valid email")]
public string email { get; set; }

[Required(ErrorMessage = "you must your age")]
[Range(18, 70, ErrorMessage = "age must be from 18 : 70")]
public int age { get; set; }

Now everything that your scripts are trying to do (badly) is done out of the box (assuming you have not disabled unobtrusive validation) and the form will not submit until the errors are corrected. 现在,您的脚本尝试做的所有事情(很糟糕)都是开箱即用的(假设您尚未禁用非侵入式验证),并且在纠正错误之前,不会提交表单。 You also now get server side validation which is the essential validation (client side validation is just a nice bonus, but anyone can easily by pass it) so you must always validate on the server 现在,您还获得了服务器端验证,这是必不可少的验证(客户端验证只是一个不错的奖励,但是任何人都可以轻松地通过它),因此您必须始终在服务器上进行验证

Also replace you manual attempt to create an input for the email property with @Html.EditorFor(m => m.email) and remove all the onclick attibutes 也可以用@Html.EditorFor(m => m.email)代替手动尝试为email属性创建输入,并删除所有onclick属性

Side note: you regex ^[a-zA-Z]+$ wont even allow a valid email address to be entered (it does not even allow the @ or . characters!). 旁注:您正则表达式^[a-zA-Z]+$甚至都不允许输入有效的电子邮件地址(甚至不允许@.字符!)。 Using the EmailAddress] attribute will generate the correct regex which is (from jQuery Validation 1.9.0 ) 使用EmailAddress]属性将生成正确的正则表达式,该正则表达式是(来自jQuery Validation 1.9.0

^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$

The allvalidate() function should look like this ( call submit function, not return value) : allvalidate()函数应如下所示(调用Submit函数,而不是返回值):

<script>
        function allvalidate() {
            var validated = true;
            if (!validate()) validated = false;
            if (!checkAge(age)) validated = false;
            if (!checkuser(email)) validated = false;

            if(validated)
                $('[type="submit"]').submit();
        }
   </script>

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

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