1

如何有条件地禁用某些字段的客户端验证?为ASP.NET MVC中的某些字段禁用客户端验证

这里是什么,我需要做的例子:

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

它不起作用,因为:当用户单击第二个(确认屏幕)上的重新发送按钮时,客户端验证将不会通过。它会说即使没有字段,也需要电子邮件。在确认页面发送给用户之前,如何禁用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" /> 
    <% } %> 
<% } %> 

在该模型中都EmailName需要字段来执行客户端验证。

例控制器动作

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); 
} 

回答

1

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

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

这样第一个视图可以有客户端验证,第二个视图不能选择它并按照它的意愿去做。

+0

是的,我是...很棒的笔记,谢谢! – drasto 2011-03-22 09:02:40

2

正是由于这个简单的解决方案,我会隐藏第二个确认电子邮件字段并保持其价值。

<%} 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" /> 
    <% } %> 
<% } %> 
+0

是的,这是我想到的一种解决方案。但我不想这样做。我的例子只是一个例子,我不喜欢这个想法,如果发送可能大量的用户输入和回来。还有像密码这样的敏感数据。我知道他们至少发送一次,但我不想只发送一次以上。 – drasto 2011-03-21 09:17:09

1

我想,在这里它不是全部或全部问题。因此,您需要禁用该视图的客户端验证并手动检查要验证的控件。 (离开我的头顶)。

编辑:如果我想做手动客户端验证,我会使用jQuery,因为它在这样的任务是如此直截了当。

+0

那么我该如何禁用代码**中的所有验证**?没有什么像'Html.DisableClientSideValidation()'... – drasto 2011-03-21 09:13:48

+3

像这样'Html.EnableClientSideValidation(false)' – 2011-03-21 09:18:17

+2

它是Html。EnableClientValidation(false)(至少现在在MVC 4中) – 2013-01-03 12:08:39