Asp.net mvc MVC/ASP.NET:客户端验证不起作用 编辑:把这个问题换成这个问题:

Asp.net mvc MVC/ASP.NET:客户端验证不起作用 编辑:把这个问题换成这个问题: ,asp.net-mvc,validation,client-side,Asp.net Mvc,Validation,Client Side,在ASP.NET/MVC中工作时,我很难让(不引人注目的,甚至不引人注目的)客户端验证正常工作。(再次回答是,但这一次是出于不同的原因。) 注意:文章底部的编辑很重要,特别是编辑2和3 问题是,客户端验证完全不起任何作用(见下文),即使所有成分似乎都已到位。我已经通读了很多关于堆栈溢出的问题和答案,在我的项目中似乎所有的事情都做得很正确,但仍然不起作用。我错过了什么 在我的Web.config文件(根文件夹中的文件,而不是视图文件夹中的文件)中,我已显式启用客户端验证: <appSetti

在ASP.NET/MVC中工作时,我很难让(不引人注目的,甚至不引人注目的)客户端验证正常工作。(再次回答是,但这一次是出于不同的原因。)

注意:文章底部的编辑很重要,特别是编辑2和3

问题是,客户端验证完全不起任何作用(见下文),即使所有成分似乎都已到位。我已经通读了很多关于堆栈溢出的问题和答案,在我的项目中似乎所有的事情都做得很正确,但仍然不起作用。我错过了什么

在我的Web.config文件(根文件夹中的文件,而不是视图文件夹中的文件)中,我已显式启用客户端验证:

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
我在视图中添加了这些包(实际上是在shared\u Layout.cshtml父视图中):

在为视图生成的源代码中,这些脚本(以及一些其他脚本)显示如下:

据我所知,这是正确的。(我还在同一视图的其他地方广泛使用jQuery和knockout。)此外,在浏览器控制台中没有加载错误

然后在我的ViewModel中,我有一封带注释的属性电子邮件(除其他外):

在我看来,这是相应的代码:

@Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Email)
        </div>
    </div>
@Html.ValidationSummary(“,new{@class=“text danger”})
@LabelFor(m=>m.Email,新的{@class=“col-md-2控制标签”})
@TextBoxFor(m=>m.Email,新的{@class=“form control”})
@Html.ValidationMessageFor(m=>m.Email)
这将生成以下源代码(单击放大):

据我所知,这似乎也是正确的

但是,当我在输入字段中键入明显无效的电子邮件地址,并使该字段失去焦点(通过跳到下一个字段)时,不会出现错误消息。既不在摘要中,也不在电子邮件字段本身的特定错误消息中。如图所示:

(小红方块是.field validation有效元素,应该包含错误消息,但不包含。出于测试目的,我用红色边框装饰了此元素。)

另外,当我按下submit按钮时,输入字段被简单地提交到服务器操作方法(然后该方法正确地确定输入无效)。但事实上,在启用客户端验证的情况下,除非客户端验证成功,否则不应该进行提交。但是,这基本上就是全部问题:客户端验证根本不会发生,尽管生成了正确的HTML(大概是!)

编辑1:

下面是整个表单的HTML/Razor:

@model Treinen2.Models.RegisterViewModel
@{
    ViewBag.Title = "Register";
}

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Create a new account.</h4>
    <hr />
    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Email)
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" class="btn btn-default" value="Register" />
        </div>
    </div>
}
@model Treinen2.Models.RegisterViewModel
@{
ViewBag.Title=“寄存器”;
}
@使用(Html.BeginForm(“Register”、“Account”、FormMethod.Post、new{@class=“form horizontal”、role=“form”}))
{
@Html.AntiForgeryToken()
创建一个新帐户。

@Html.ValidationSummary(“,new{@class=“text danger”}) @LabelFor(m=>m.Email,新的{@class=“col-md-2控制标签”}) @TextBoxFor(m=>m.Email,新的{@class=“form control”}) @Html.ValidationMessageFor(m=>m.Email) @LabelFor(m=>m.Password,新的{@class=“col-md-2控制标签”}) @Html.PasswordFor(m=>m.Password,新的{@class=“form control”}) @LabelFor(m=>m.ConfirmPassword,新的{@class=“col-md-2控制标签”}) @Html.PasswordFor(m=>m.ConfirmPassword,new{@class=“form control”}) }
这是在一个名为Register.cshtml的共享视图中,根据特定条件,它通过从home View Index.cshtml调用@Html.Partial(“Register”)来显示。[作为练习,我试图构建一个单页API应用程序,因此所有内容都包含在主页(索引)中,所有导航都发生在客户端(除了提交“注册”按钮本身之外,该按钮本身被发送到服务器操作方法,至少目前是这样)。显然只有一部分('页面')在任何时间显示Index.cshtml,我使用敲除绑定。]

编辑2:

好的,我注意到了以下几点:如果我在Index.cshtml中放置了相同的表单,并将相同的模型添加到该索引视图中,那么客户端验证可以完美地工作。只有部分人认为它行不通。这表明我可以简单地停止使用部分视图,而只是将其内容包含在Index.cshtml上,如测试所示。另一方面,我仍然不明白为什么对register表单使用部分视图也不起作用。(有了这些新信息,我可能不得不以另一种形式重新提问,但现在没有时间……。[/EDIT 2]

编辑3:

看来我正在接近了解问题的根本原因。因为现在我在索引视图中对表单进行了验证。。。但是,当我将整个表单放在一个由敲除属性data bind=“If:……”绑定的DIV元素中时,它就会停止工作,所以这似乎是问题的本质:客户端验证和敲除绑定之间的交互。敲除绑定本身工作正常,似乎阻止了验证的执行。虽然我还是不明白为什么会这样。[/编辑3]


那么,我错过了什么?任何有建设性的建议,请在几小时后查看。

尝试
Html.ValidationSummary(true,“,new{@class=“text danger”})
EditorFor
您需要发布完整的Html源代码,其中显示了表单的呈现方式和提交方式
public class RegisterViewModel

     {
            [Required]
            [EmailAddress]
            [Display(Name = "Email")]
            public string Email { get; set; }

            // some other properties…
      }
@Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Email)
        </div>
    </div>
@model Treinen2.Models.RegisterViewModel
@{
    ViewBag.Title = "Register";
}

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Create a new account.</h4>
    <hr />
    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.Email)
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" class="btn btn-default" value="Register" />
        </div>
    </div>
}