如何在用户输入电子邮件时验证电子邮件域名地址以显示某些项目以显示在下拉列表菜单中?

问题描述:

我正在一个网站上工作,员工有一个Gmail或雅虎的电子邮件,这决定了他们得到的手机的类型。如果他们进入Gmail账户,某些类型的电话(iPhone,Galaxy,Samsung等)应该出现在下拉列表中。同样应该为雅虎帐户工作。 Gmail帐户的电话类型多于雅虎帐户。我拿到了文本框并下拉框工作。不过,我需要帮助编写一个函数来说明gmail或yahoo之间的区别,以确定在用户输入电子邮件域时显示哪些类型的电话。不知道是否需要执行switch语句或正则表达式匹配。如何在用户输入电子邮件时验证电子邮件域名地址以显示某些项目以显示在下拉列表菜单中?

控制器代码如下:

[Display(Name = "Email Address")] 
[RegularExpression(@"^([a-zA-Z0-9._%+-]{1,50})+(@gmail|@GMAIL|@YAHOO|@yahoo)+(\.)+(com|COM)$", 
     ErrorMessage = "Invalid Email Format. Use: [email protected] or [email protected]")] 

[Required(ErrorMessage="Please input gmail or yahoo")] 
public string Email { get; set; } 

视图代码如下:从用户输入

<div class="col-lg-2 col-md-3 col-sm-3"> 
    @Html.EditorFor(model => model.Email, 
      new { htmlAttributes = 
       new { 
         @class = "form-control", 
         @placeholder = "[email protected] or [email protected]", 
         data_bind = "value: Request.Email", 
         data_toggle = "tooltip", 
         data_placement = "top", 
         title = "Requestor's Email" } 
    }) 

    @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" }) 
</div> 

dropdowncascade.js //获取信息

$(document).ready(function() { 
$("#Carriers").change(function() { 
    var carrierId = $(this).val(); 
    var emailAddress = $("#Email").val(); 
    $.getJSON("../Home/LoadPhonesByCarrierId", { carrierid: carrierId, emailaddress: emailAddress }, //reads what carrier id and the email from the user input 
      function (phonesData, accsData) { 
       var select = $("#Phones"); 
       select.empty(); 
       select.append($('<option/>', { 
        value: 0, 
        text: "Select a Phone" 
       })); 
       $.each(phonesData, function (index, itemData) { 
        select.append($('<option/>', { 
         value: itemData.Value, 
         text: itemData.Text 
        })); 
       }); 
      }); 
}); 

帮助与HomeControllers功能的.cs! //需要匹配电子邮件域以确定在下拉列表中显示哪些电话类型。

  public JsonResult LoadPhonesByCarrierId(string carrierid, string email) 
    { 
     // string Email = txt.Text; 
     //The email difference swicth statement 
     //if(Regex.IsMatch(Email, @"^([a-zA-Z0-9._%+-]{1,50})(@gmail|@GMAIL)(\.)(com|COM)$")) 
     string pattern = @"^([a-zA-Z0-9._%+-]{1,50})(@gmail|@GMAIL)(\.)(com|COM)$"; 
     string input = "[email protected]"; 
     Match match = Regex.Match(input, pattern); 
      if (match.Success) 
     { 
      var com = from c in db.Phones 
         where c.CommerceAllowed == true 
         select c; 

     } 
      else 
     { 
      var gov = from g in db.Phones 
         where g.GovAllowed == true 
          select g; 
     } 

     var phonesList = this.GetPhones(Convert.ToInt32(carrierid)); 
     var phonesData = phonesList.Select(m => new SelectListItem() 
     { 
      Text = m.Name, 
      Value = m.PhoneID.ToString(), 
     }); 
     return Json(phonesData, JsonRequestBehavior.AllowGet); 
    } 

 public JsonResult LoadPhonesByCarrierId(string carrierid, string emailaddress) 
     { 
     string pattern = @"^([a-zA-Z0-9._%+-]{1,50})(@gmail|GMAIL)(\.)(com|COM)$"; 
     Match match = Regex.Match(emailaddress, pattern);//checks the email address from user and pattern. 
     if (match.Success)//if true it will do the following 
     { 
         var gov = from g in db.Phones 
         where g.GovAllowed == true 
         select g; 
     } 
     else 
     { 
         var com = from c in db.Phones 
         where c.CommerceAllowed == true 
         select c; 
     } 


    var phonesList = this.GetPhones(Convert.ToInt32(carrierid)); 
    var phonesData = phonesList.Select(m => new SelectListItem() 
    { 
     Text = m.Name, 
     Value = m.PhoneID.ToString(), 
    }); 
    return Json(phonesData, JsonRequestBehavior.AllowGet); 
} 

我真的不明白什么是这里的关键点。首先,假设与e-Mail模式已被选中,所以要检查的唯一事情是域。一个非常可靠的方法是检查你将存储在数据库/数据库上下文中的域列表。

如果你想要一个简单,快速和肮脏的解决方案,创建两个列表,并检查它们。

var eMailProviders = new Dictionary<int, string[]>(); 

    eMailProviders.Add(1, new []{ "gmail.com", "googlemail.com" }); 
    eMailProviders.Add(2, new []{ "yahoo.com", "yahoomail.com" }); // I don't know the domains... 

    var email = "[email protected]"; 

    var providerId = eMailProviders 
     .Where(x => x.Value.Any(domain => email.EndsWith(domain))) 
     .Select(x => x.Key) 
     .FirstOrDefault(); 

    Console.WriteLine(providerId); 

Fiddle

还是因为我得到的问题,错了吗?当然,这是一个硬编码的解决方案,但是你得到了Idea,这可以传送到你的数据库。此外,你可以尝试做出正则表达式的决定,但为什么要麻烦?很容易就搞乱了正则表达式,很难反映所有的域选项。

+0

我没有电子邮件数据库。我需要弄清楚如何在switch语句或if-else语句中编写正则表达式。如果这在正则表达式中甚至是可能的。在控制器视图中,我使用正则表达式来确定它是否是有效的电子邮件地址。因此,在homecontrollers.cs文件中,我需要它来检查它是否是yahoo或gmail域,它将转到数据库并收集要显示的电话类型。 – Sandy2016

+1

@ Sandy25:你错过了这个答案的要点。这将是使用'[RegularExpression]'属性的替代方法。无论如何,这是对属性的不好使用。它旨在验证一般格式,而不是内容。无论如何,通过这里的答案,您可以轻松验证地址是否以有效域的可配置列表结尾(以防您需要稍后添加更多内容)。然后您只需通过'ModelState.AddModelError(“Email”,“无效的电子邮件提供商。”)手动将错误添加到'ModelState'。 –

+0

你甚至可以通过创建一个自定义验证属性来提供这个验证。 –