【问题标题】:Disable client side validation for some fields in ASP.NET MVC禁用 ASP.NET MVC 中某些字段的客户端验证
【发布时间】:2011-07-19 12:49:03
【问题描述】:

如何有条件地禁用某些字段的客户端验证?

这是我需要做的示例:

  • 用户填写姓名和地址并提交。
  • 两者都经过服务器端和客户端的验证。如果验证通过,电子邮件将发送到给定地址并存储(名称、地址)对。
  • 作为响应显示相同的页面(我不想重定向!)这次确认。用户可以重新输入他们的姓名并提交。在这种情况下,电子邮件将被重新发送到与给定名称对应的地址。

它不起作用,因为:当用户单击第二个(确认屏幕)上的重新发送按钮时,客户端验证不会通过。它会说电子邮件是必需的,即使没有字段。如何在确认页面发送给用户之前禁用 javascript 验证电子邮件?

示例 ASP.NET MVC 页面

<%if (Model.Confirm == false){ %>
    <% using (Html.BeginForm()) { %>
        Your email: <%: Html.EditorFor(m => m.Email) %>
        Your name: <%: Html.EditorFor(m => m.Name) %>
        <input type="submit" value="Send Email" />
    <% } %>
<%} else{ %>
    The e-mail was send! You can write your name and click button to resend it.
    <% using (Html.BeginForm()) { %>
        Your name: <%: Html.EditorFor(m => m.Name) %>
        <input type="submit" value="Resend me email again" />
    <% } %>
<% } %>

在模型中,Email 和 Name 都是强制客户端验证的必填字段。

示例控制器操作

 public ActionResult Index(){
     return new MyModel {Confirm = false;}
 }

 [HttpPost]
 public ActionResult Index(MyModel model){
     if(DataHelper.isKnown(model.Name)){
         //send e-mail to the address corresponding to name in database 
     }
     if(!ModelState.IsValid) {
         return View(model);
     }
     //Send e-mail to address in email
     //store pair name->email to database
     model.Confirm = true;
     return View(model);
 }

【问题讨论】:

    标签: javascript asp.net asp.net-mvc validation client-side-validation


    【解决方案1】:

    这只是一个简单的解决方案,我将隐藏电子邮件字段以进行第二次确认并保留其值。

    <%} else{ %>
        The e-mail was send! You can write your name and click button to resend it.
        <% using (Html.BeginForm()) { %>
            <%: Html.HiddenFor(m => m.Email) %>
            Your name: <%: Html.EditorFor(m => m.Name) %>
            <input type="submit" value="Resend me email again" />
        <% } %>
    <% } %>
    

    【讨论】:

    • 是的,这是我想到的一种解决方案。但我不想那样做。我的例子只是一个例子,我不喜欢在那里发送可能大量的用户输入并再次返回的想法。还有密码等敏感数据。我知道它们至少发送一次,但我不想只发送一次。
    【解决方案2】:

    为什么不使用 2 个不同的视图?您不必重定向。我认为您在这里违反了 SRP。这种观点不止一个目的。

    public ActionResult SubmitEmail(Model model)
    {
         if(!emailWasSent)
            return View("FirstView");
         else
            return View("ConfirmationView");
    }
    

    这样,第一个视图可以进行客户端验证,而第二个视图不能选择加入并按照自己的意愿进行操作。

    【讨论】:

      【解决方案3】:

      我认为,这里要么没有问题,要么完全没有问题。因此,您需要禁用该视图的客户端验证并手动检查要验证的控件。 (在我的脑海中)。

      编辑:如果我想进行手动客户端验证,我会使用 jQuery,因为它在此类任务中非常简单。

      【讨论】:

      • 那么我如何禁用所有验证从代码?没有什么比得上Html.DisableClientSideValidation()...
      • 赞这个Html.EnableClientSideValidation(false)
      • 这是 Html.EnableClientValidation(false)(至少现在在 MVC 4 中)
      【解决方案4】:

      当向元素添加“禁用”属性时,可以将其从客户端验证中排除。

      Disabling Client Side Validation For Disabled Input Controls In ASP.NET MVC - Imran Baloch's Blog

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 2014-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多