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