【发布时间】:2017-08-03 15:16:32
【问题描述】:
好的,我是一名初学者,正在开发一个已经存在 ASP.Net MVC 5 web 应用程序。
WebApp 概述: 这个网络应用程序更像是工作印刷机,可以根据客户的需求动态创建不同类型的小部件和功能。因此,多个 URL 命中此 Web 应用程序,它们都被视为一个单独的网站。所有小部件都有自己的网址。这些 Url 链接到不同的客户端和所有有趣的东西。(幽默我)。
问题:问题可能与我上面解释的完全无关。如何在 ASP.Net MVC 5 中正确使用远程验证属性。下面是代码 sn-p 和问题。我只有一个电子邮件 ID 字段,我想对其应用远程验证。
型号
public class ForgotPasswordMV
{
[Display(Name = "Email"), Required]
[Remote("IsEmailUnique", "Settings", ErrorMessage = "Somethin Wrong")]
public string EmailId { get; set; }
}
控制器功能
Public JsonResult IsEmailUnique(string EmailId)
{
var respObj = SecurityHelper.EmailCount(EmailId); // if count > 1 returns false
return Json(respObj, JsonRequestBehavior.AllowGet);
}
查看文件
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<h2>Forgot Password</h2>
@using (@Html.BeginForm("ForgotPassword", "Security"))
{
@Html.ValidationSummary(true, "Please fix below error")
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(m => m.EmailId)
@Html.TextBoxFor(m => m.EmailId, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.EmailId)
</div>
<button class="btn btn-primary">Continue</button>
}
因此,当用户第一次输入电子邮件 ID 并且返回类型为 false 时,ErrorMessage = "Somethin Wrong" 会正确显示。但问题从第二次开始。现在每次我在电子邮件字段中输入字母来更改它。在每个键盘上单击 IsEmailUnique 函数开始受到打击。我的意思是,当我在看到错误消息后第一次看到错误消息时,我现在转到 UI 文本框并开始提供其他一些电子邮件 ID,但现在对于我输入的每个字母,远程验证方法都会受到打击。理想情况下,当我点击文本框或单击 sbumit 按钮时应该会发生这种情况(它第一次工作的方式)
编辑
检查 UI 文本框的元素代码
<div class="form-group">
<label for="EmailId">Email</label>
<input class="form-control input-validation-error" data-val="true" data-val-remote="Something went wrong" data-val-remote-additionalfields="*.EmailId" data-val-remote-url="/Settings/IsEmailUnique" data-val-required="The Email field is required." id="EmailId" name="EmailId" type="text" value="" aria-required="true" aria-invalid="true" aria-describedby="EmailId-error">
<span class="field-validation-error" data-valmsg-for="EmailId" data-valmsg-replace="true"><span id="EmailId-error" class="">Something went wrong</span></span>
</div>
进一步了解
在 第二次尝试 期间(在成功看到远程验证错误之后),当我尝试在电子邮件 ID 字段中添加任何字母时,我注意到下面的代码块被命中,然后验证方法 IsEmailUnique 被命中。
public class SimRoute : Route
{
/// <summary>
/// Base c-tor, implementing the base class ctor
/// </summary>
public SimRoute(string url, IRouteHandler routeHandler) : base(url, routeHandler) { }
/// <summary>
/// This is where the "magic" happens - this is where the subdomain is retrieved & inserted into route values, so it can be referenced at a later time
///
/// The rest of the functionality is being retained by running the call to the base class
/// </summary>
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData routeData = base.GetRouteData(httpContext);
if (routeData != null)
{
string[] temp = httpContext.Request.Url.Host.Split('.');
if (temp.Length > 0)
{
routeData.Values.Add("subdomain", temp.First());
}
}
return routeData;
}
}
调用堆栈
老实说,我不确定上面的代码 sn-p 是做什么的,但为什么我在 EmailID 文本框中输入任何字母后,这个代码就会被命中,或者这个代码甚至与问题有远程关系.我最初的问题是,为什么对文本框中的每个字母都进行远程验证。我试图在问题中提供尽可能多的细节。请指导我。
【问题讨论】:
-
因为这是
jquery.validate.js的默认行为 - 它的“惰性”(意味着您可以在不触发验证的情况下通过控件切换,但是一旦控件由于值已更改而首次验证,则验证此然后执行于.keyup()) -
@StephenMuecke:谢谢。 :)
标签: c# asp.net asp.net-mvc validation asp.net-mvc-5