【问题标题】:How to correctly use Remote Validation attribute in ASP.Net MVC 5如何在 ASP.Net MVC 5 中正确使用远程验证属性
【发布时间】: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


【解决方案1】:

我建议您尝试从字段/表单中删除 onkeypress 事件,如以下问答中所述

ASP.NET Remote Validation only on blur?

【讨论】:

  • 但这将是一种解决方法。为什么会发生这种情况?
  • 哦,对不起,您的意思是说这是远程验证的预期标准行为。我需要明确地照顾它吗?我是初学者,所以我不太了解。
  • 是的,有标准的行为,你应该经常阅读规范和 MSDN 中关于事情如何工作的东西
猜你喜欢
  • 2013-11-09
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多