Asp.net mvc 客户端验证未显示消息

Asp.net mvc 客户端验证未显示消息,asp.net-mvc,asp.net-mvc-4,jquery-validate,unobtrusive-validation,Asp.net Mvc,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,我有一个MVC4互联网应用程序,它带有一个用于创建用户帐户的表单。表单验证工作正常,但当输入验证失败时,不会显示任何错误消息。它仍然阻止提交,直到验证问题得到解决,但没有文本 剃须刀视图窗体 <h2>Create New Account</h2> <fieldset> <legend></legend> @using (Html.BeginForm("CreateUser",null)){ @Html.A

我有一个MVC4互联网应用程序,它带有一个用于创建用户帐户的表单。表单验证工作正常,但当输入验证失败时,不会显示任何错误消息。它仍然阻止提交,直到验证问题得到解决,但没有文本

剃须刀视图窗体

<h2>Create New Account</h2>
<fieldset>
    <legend></legend>
    @using (Html.BeginForm("CreateUser",null)){
        @Html.AntiForgeryToken()
        <table class="create">
            <tr>
                <td colspan="2"><b>New Account</b>
            </tr>
            <tr>
                <td>@Html.DisplayNameFor(model=>model.UserName)</td><td>@Html.TextBoxFor(model=>model.UserName)</td>
                <td>@Html.DisplayNameFor(model=>model.EmailAddress)</td><td>@Html.TextBoxFor(model=>model.EmailAddress)</td>
                <td><input type="submit" value="Create User" /></td>
            </tr>
        </table>
    }
</fieldset>
    @Html.ValidationSummary()
所使用的模型是一个实体模型,我添加了一个分部类来注释验证需求

[MetadataType(typeof(UserProfileMetadata))]
public partial class UserProfile
{
    //Empty Class just required for adding class level attribute
}

public class UserProfileMetadata
{
    //Fields from user profile requiring annotations
    [EmailAddress]
    [Required]
    [Display(Name = "Email Address")]
    public string  EmailAddress { get; set; }

    [Required]
    public string UserName { get; set; }

}

验证正在工作,但现在显示消息使我认为这一定是标记错误,但我就是看不到它。

在表单中移动ValidationSummary将修复它

<h2>Create New Account</h2>
<fieldset>
    <legend></legend>
     @using (Html.BeginForm("CreateUser",null)){
        @Html.ValidationSummary()
        @Html.AntiForgeryToken()
        <table class="create">
            <tr>
                <td colspan="2"><b>New Account</b>
            </tr>
            <tr>
                <td>@Html.DisplayNameFor(model=>model.UserName)</td>    <td>@Html.TextBoxFor(model=>model.UserName)</td>
            <td>@Html.DisplayNameFor(model=>model.EmailAddress)</td><td>@Html.TextBoxFor(model=>model.EmailAddress)</td>
            <td><input type="submit" value="Create User" /></td>
        </tr>
    </table>
}
</fieldset>
创建新帐户
@使用(Html.BeginForm(“CreateUser”,null)){
@Html.ValidationSummary()
@Html.AntiForgeryToken()
新帐户
@Html.DisplayNameFor(model=>model.UserName)@Html.TextBoxFor(model=>model.UserName)
@Html.DisplayNameFor(model=>model.EmailAddress)@Html.TextBoxFor(model=>model.EmailAddress)
}

对于无意将
@Html.ValidationSummary
移动到表单中的任何人,即它位于_Layout.cshtml中,您喜欢它,这里有一个解决方法

下面的方法显然是Microsoft用来填充
@Html.ValidationSummary
的方法。在它的标准格式中,它在
$('this')
中查找
数据valmsg summary true
本例中的
是调用表单。嗯,我的
@Html.ValidationSummary
保存在_Layout.cshtml上的
页面正文中,以保持干燥

function onErrors(event, validator) { // '#pageBody' is the containing element
    var container = $('#pageBody').find("[data-valmsg-summary=true]"), 
    list = container.find("ul"); if (list && list.length && validator.errorList.length) {
        list.empty(); container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
        $.each(validator.errorList, function () {
             $("<li />").html(this.message).appendTo(list);
        });
    }
}
为此:

var container = $('#pageBody').find("[data-valmsg-summary=true]")
现在,我通过点击按钮触发验证。为了触发
onerror(事件、验证器)
,我使用了以下jQuery:

    $('#btnSave').click(function () {
        if ($('form').valid()) {
           // Do stuff
        } else {
            onErrors(event, $('form').data('validator'));
        }
    });
瞧,@Html.ValidationSummary即使在使用jQuery.unobtrusive时也会被填充

非常感谢Leniel Macaferi为我指明了正确的方向:

您是否尝试将验证摘要移动到表单中?此外,validationsummary在单击submit(提交)后才会填充结果。如果是,则问题在于表单中没有摘要。把它作为解决办法,我会接受的。盯着它看了大约40分钟,却没有看到它!我自己也做过同样的事,总有一天我的脸和手掌会被打黑的:)
var container = $('#pageBody').find("[data-valmsg-summary=true]")
    $('#btnSave').click(function () {
        if ($('form').valid()) {
           // Do stuff
        } else {
            onErrors(event, $('form').data('validator'));
        }
    });